چرا یک کادر سیاه کافی نیست

اکثر ابزارهای PDF به کاربران اجازه می‌دهند با کشیدن یک مستطیل سیاه روی متن حساس، آن را «پوشانده» (redact) کنند. این مستطیل کلمات را روی صفحه مخفی می‌کند، اما کاراکترهای زیرین همچنان در جریان محتوای (content stream) فایل باقی می‌مانند. هر کسی می‌تواند متن مخفی شده را انتخاب، کپی یا با یک اسکریپت ساده استخراج کند. به عبارت دیگر، داده‌ها همچنان آنجا هستند؛ کادر سیاه صرفاً یک پوشش بصری است.

مشکلی که توسعه‌دهنده با آن روبرو شد

نویسنده به یک ویرایشگر PDF نیاز داشت که کاملاً در مرورگر اجرا شود، بدون اینکه فایل‌ها را به سرور آپلود کند. این محدودیت، تکیه بر یک سرویس بک‌اند (back-end) برای حذف متن را غیرممکن می‌سازد. راهکارهای موجود در سمت کلاینت (client-side) صرفاً یک شکل را روی محتوا اضافه می‌کنند که باعث می‌شود متن اصلی دست‌نخورده باقی بماند. چالش اصلی این بود که متن را به‌طور دائمی حذف کرد، در حالی که سرعت عملیات و قابلیت استفاده از سند حفظ شود.

رسترایز کردن انتخابی صفحات: ایده اصلی

به‌جای تبدیل کل فایل PDF به یک تصویر — مرحله‌ای که باعث حجیم شدن فایل و از بین رفتن قابلیت جستجو می‌شود — این راهکار فقط صفحاتی را که حاوی بخش‌های پوشانده شده هستند، رسترایز (rasterise) می‌کند. آن صفحات به بیت‌مپ (bitmap) تبدیل می‌شوند؛ در حالی که سایر صفحات به صورت PDF برداری (vector) باقی می‌مانند تا قابلیت انتخاب متن، جستجو و حجم کم فایل حفظ شود.

این رویکرد سندی ایجاد می‌کند که عادی به نظر می‌رسد: ۱۹ صفحه شفاف و قابل جستجو باقی می‌مانند، در حالی که آن صفحه حساس، تنها یک تصویر پیکسلی است که اطلاعات مخفی در آن دیگر وجود ندارد.

سه قانون کاربردی برای تبدیل قابل اعتماد

  1. رندر با مقیاس سه برابر – بیت‌مپ با سه برابر رزولوشن معمولی صفحه تولید می‌شود. یک رندر با رزولوشن پایین در کنار صفحات برداری اطراف، تار به نظر می‌رسد که می‌تواند باعث ایجاد شک شود یا صرفاً غیرحرفه‌ای به نظر برسد.
  2. ادغام تمام عناصر بصری در بیت‌مپ – یادداشت‌ها (annotations)، امضاها، واترمارک‌ها و مستطیل پوشاننده، پیش از رسترایز شدن صفحه، با هم ترکیب می‌شوند. ترکیب یادداشت‌های برداری با یک تصویر رستر در یک صفحه می‌تواند باعث گیج شدن نمایش‌دهنده‌های PDF و بروز خطاهای نمایش شود.
  3. اتصال به ویوپورت (viewport)، نه پیکسل‌ها – یادداشت‌ها به مختصات ویوپورت صفحه متصل هستند. وقتی کاربر زوم می‌کند، عناصر به‌جای جابه‌جایی یا تغییر مقیاس نامنظم، تراز باقی می‌مانند؛ در غیر این صورت، متن زیرین ممکن است فاش شود.

محافظت در برابر شرایط رقابتی (race conditions)

رندر کردن هر صفحه یک وظیفه ناهمگام (asynchronous) است. اگر کاربر پنجره مرورگر را سریع تغییر اندازه دهد، چندین عملیات رندر ممکن است هم‌پوشانی داشته باشند و باعث ایجاد فریم‌های شکسته یا هم‌پوشان در بوم (canvas) شوند. این پیاده‌سازی یک توکن رندر برای هر صفحه معرفی می‌کند: هر درخواست رندر جدید، توکن قبلی را باطل می‌کند و باعث می‌شود وظیفه قدیمی خود را لغو کند. نتیجه، تجربه‌ای روان و بدون نقص (glitch-free) حتی در هنگام تغییرات سریع رابط کاربری است.

موازنه (trade-offs) چگونه است

تبدیل یک صفحه به بیت‌مپ، هرگونه متن مخفی را حذف می‌کند، اما قابلیت جستجو یا کپی کردن محتویات آن صفحه را نیز از بین می‌برد.

مسیر آینده این پروژه

نتیجه‌گیری

یک کادر سیاه ساده داده‌ها را حذف نمی‌کند؛ بلکه فقط آن‌ها را پنهان می‌کند. با تبدیلِ تنها صفحاتی که نیاز به پوشاندن دارند به بیت‌مپ‌های با رزولوشن بالا و برداری نگه داشتن باقی صفحات PDF، یک ویرایشگرِ صرفاً مبتنی بر مرورگر می‌تواند متن‌های حساس را به‌طور دائمی پاک کند و در عین حال، سند را سریع، قابل جستجو و خصوصی نگه دارد. این روش میان امنیت و قابلیت استفاده تعادل برقرار می‌کند، اما کاربران باید هنگام پوشاندن صفحات زیاد، تأثیر تجمعی بر حجم فایل و قابلیت جستجو را مد نظر داشته باشند.