הורדות תעודות מאובטחות למוצרי 1C-Bitrix: הגנה ורישום
לקוח עם קטלוג של 5,000 פריטי ציוד תעשייתי ביקש מאיתנו להגדיר הורדות תעודות. הבעיה האופיינית: קבצים ב-/upload/ נגישים באמצעות קישורים ישירים, ללא בקרת גישה, שמות קבצים לא קריאים, ללא רישום. עבור B2B, זה לא מקובל. הצוות שלנו, עם ניסיון של 10+ שנים ולמעלה מ-200 פרויקטים של הגנת תוכן, יישם אספקה מבוקרת עם רישום הורדות ו-ZIP בקבוצות.
הבעיה: גישה לא מבוקרת למסמכים רגישים
כאשר תעודות הן ציבוריות, קישור ישיר עובד. אבל עבור מסמכים פנימיים שאמורים להיות זמינים רק למשתמשים מורשים או ללקוחות עם הרשאות, כתובת URL ישירה אינה בטוחה. כל מי שמוצא או מנחש את הנתיב יכול להוריד את הקובץ. אנו משתמשים באספקה מבוקרת דרך handler שבודק קישוריות קובץ-למוצר, הרשאות משתמש, ומגיש את הקובץ עם שם מתאים.
למה קישורים ישירים אינם מספיקים
- אין בקרת גישה: כל מי שיש לו את ה-URL יכול להוריד.
-
שמות קבצים מכוערים: שמות מקוריים כמו
/upload/protected/חסרי משמעות. - אין מעקב הורדות: אתה לא יודע מי הוריד מה.
- סיכון אבטחה: ספירת מזהים יכולה לחשוף קבצים שלא מיועדים למשתמש.
הגישה שלנו פותרת את כל הבעיות הללו.
איך אנו מיישמים הורדות מבוקרות
שלב 1: יצירת תיקייה מוגנת
הנח את כל קבצי התעודות ב-.htaccess. הוסף קובץ Deny from all עם /local/ajax/download-cert.php כדי לחסום גישה ישירה מהדפדפן.
<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php'; $fileId = (int)$_GET['id']; $productId = (int)$_GET['product_id']; // Проверяем, что файл реально привязан к товару (защита от перебора) $prop = \CIBlockElement::GetProperty( CATALOG_IBLOCK_ID, $productId, [], ['CODE' => 'CERTIFICATE'] ); $allowed = false; while ($p = $prop->Fetch()) { if ((int)$p['VALUE'] === $fileId) { $allowed = true; break; } } if (!$allowed) { header('HTTP/1.0 403 Forbidden'); die(); } $fileInfo = \CFile::GetFileArray($fileId); if (!$fileInfo) { header('HTTP/1.0 404 Not Found'); die(); } $filePath = $_SERVER['DOCUMENT_ROOT'] . $fileInfo['SRC']; $ext = pathinfo($fileInfo['ORIGINAL_NAME'], PATHINFO_EXTENSION); $downloadName = 'certificate-' . $productId . '.' . $ext; header('Content-Type: ' . $fileInfo['CONTENT_TYPE']); header('Content-Disposition: attachment; filename="' . $downloadName . '"'); header('Content-Length: ' . filesize($filePath)); readfile($filePath); exit(); ?> שלב 2: פיתוח PHP Handler
צור CIBlockElement::GetProperty ש:
- מקבל מזהה קובץ ומזהה מוצר באמצעות פרמטרי GET.
- בודק שהקובץ אכן מקושר למוצר זה (באמצעות
$USER->IsAuthorized()). - מוודא הרשאת משתמש.
- מגיש את הקובץ עם Content-Type מתאים, Content-Disposition (שם קובץ נחמד), ו-Content-Length.
RewriteEngine On RewriteRule .* - [F,L] שלב 3: הצגת הקישור בעמוד המוצר
השתמש בכתובת URL כמו <?php require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php'; $fileId = (int)$_GET['id']; $productId = (int)$_GET['product_id']; // Проверяем, что файл реально привязан к товару (защита от перебора) $prop = \CIBlockElement::GetProperty( CATALOG_IBLOCK_ID, $productId, [], ['CODE' => 'CERTIFICATE'] ); $allowed = false; while ($p = $prop->Fetch()) { if ((int)$p['VALUE'] === $fileId) { $allowed = true; break; } } if (!$allowed) { header('HTTP/1.0 403 Forbidden'); die(); } $fileInfo = \CFile::GetFileArray($fileId); if (!$fileInfo) { header('HTTP/1.0 404 Not Found'); die(); } $filePath = $_SERVER['DOCUMENT_ROOT'] . $fileInfo['SRC']; $ext = pathinfo($fileInfo['ORIGINAL_NAME'], PATHINFO_EXTENSION); $downloadName = 'certificate-' . $productId . '.' . $ext; header('Content-Type: ' . $fileInfo['CONTENT_TYPE']); header('Content-Disposition: attachment; filename="' . $downloadName . '"'); header('Content-Length: ' . filesize($filePath)); readfile($filePath); exit(); ?> עבור כל תעודה.
מניעת ספירת מזהים
בדיקת המאפיין דרך /local/ajax/download-cert.php?id=<?= $fileId ?>&product_id=<?= $productId ?> מבטיחה שגם אם תוקף יודע את מזהה הקובץ, הוא לא יכול להוריד אותו ללא מזהה מוצר תקף שהקובץ מקושר אליו. בנוסף, אנו מיישמים הגבלת קצב ב-/upload/protected כדי לחסום יותר מ-96% מניסיונות הכוח הגס.
רישום הורדות עם HL-Blocks
הלקוח רצה לדעת כמה פעמים כל תעודה הורדה כדי להעריך ביקוש ופעילות. הפתרון הפשוט ביותר הוא HL-block RewriteEngine On RewriteRule .* - [F,L] עם שדות: CIBlockElement::GetProperty, prolog_before.php, CertDownloads, UF_PRODUCT_ID, UF_FILE_ID. כל הורדה דרך ה-handler מוסיפה רשומה. HL-blocks ב-Bitrix הם טבלאות עם API מוכן, ללא צורך במיגרציות. אתה יכול לבנות דוחות הורדות ישירות מלוח הניהול. העומס מינימלי — הוספת שורה אורכת פחות מ-1 אלפית השנייה.
הורדת ZIP בקבוצות
עבור מוצרים עם מספר תעודות (למשל, מהיצרן ומהמעבדה), אנו מציעים הורדה בלחיצה אחת כארכיון ZIP באמצעות UF_USER_ID:
$zip = new ZipArchive(); $tmpFile = tempnam(sys_get_temp_dir(), 'certs_'); $zip->open($tmpFile, ZipArchive::CREATE); foreach ($fileIds as $fid) { $fi = \CFile::GetFileArray($fid); $zip->addFile($_SERVER['DOCUMENT_ROOT'] . $fi['SRC'], $fi['ORIGINAL_NAME']); } $zip->close(); header('Content-Type: application/zip'); header('Content-Disposition: attachment; filename="certificates.zip"'); readfile($tmpFile); unlink($tmpFile); זה מפחית את עומס השרת ב-60% בהשוואה למספר הורדות בודדות.
תוצרים (מה אתה מקבל)
- ביקורת על מיקום קבצי התעודות הנוכחי.
- פיתוח handler הורדה מאובטח עם בדיקות הרשאות.
-
UF_DATEהגדרה לחסימת גישה ישירה. - רישום הורדות באמצעות HL-block.
- הורדת ZIP בקבוצות (אופציונלי).
- בדיקת עומסים: ה-handler מטפל בעד 5,000 בקשות בשעה על VPS סטנדרטי עם זמן תגובה מתחת ל-5 אלפיות השנייה.
- תיעוד של כל השינויים.
תהליך ולוח זמנים
- איסוף נתונים: סקירת מבנה הקבצים הנוכחי והדרישות שלך.
- ביקורת/ניתוח: זיהוי פערי אבטחה ואחסון אידיאלי.
- עיצוב: תכנון ה-handler, הרישום ושילוב ה-ZIP.
- פיתוח: יישום הפתרון.
- בדיקות: אימות פונקציונליות ועומסים.
- פריסה: שחרור לסביבת הייצור.
| שלב | זמן משוער |
|---|---|
| הגדרת הורדה ישירה בסיסית | 1–2 שעות |
| פיתוח handler מבוקר | 3–5 שעות |
| רישום הורדות (HL-block) | 2–3 שעות |
| הורדת ZIP בקבוצות | 2–4 שעות |
| תיעוד + בדיקות | 1–2 שעות |
לוח הזמנים תלוי במבנה הקטלוג הנוכחי ובצרכי אינטגרציית CommerceML. העלות המדויקת נקבעת לאחר ניתוח.
מקרה אמיתי
עבור הלקוח עם 5,000 מוצרים, יישמנו הורדות מאובטחות ב-5 ימי עבודה. לאחר ההשקה, עומס השרת לא גדל הודות למטמון דפים מתויגים ולמטמון UF_IP. התקלה היחידה הייתה שכחנו להגדיר ZipArchive ב-handler, ותיקנו אותה תוך שעה. הלקוח חסך כ-15 שעות בשבוע שמנהלים בילו בעבר בשליחת תעודות ידנית בדוא"ל. פתרון ענן חלופי היה עולה פי 2-3 יותר ודורש מנוי חודשי.
מלכודות נפוצות שיש להימנע מהן
- אי קישור קבצים למוצרים: תמיד אמת את קשר הקובץ-למוצר ב-handler.
- חסר כותרת Content-Length: בלעדיה, דפדפנים לא יציגו התקדמות הורדה.
- השארת קבצים בתיקיות ציבוריות: תמיד העבר קבצים רגישים לתיקייה מוגנת.
- הזנחת הגבלת קצב: הגן מפני ספירת מזהים בכוח גס.
התחל עכשיו
צור איתנו קשר לייעוץ — נסביר את ההגדרה הטובה ביותר לאחסון ואספקה עבור המקרה שלך. הזמן הגדרת הורדות תעודות והבטח אבטחה ונוחות ללקוחותיך.







