دليل: حماية البث
قيّد المواقع التي يمكنها تضمين فيديوهاتك، وامنع الربط المباشر، واشترط رموزًا موقّعة على كل تضمين.
لكل مشروع صفحة الحماية في لوحة التحكم وفيها أربعة عناصر تحكم تسري على المشروع كله — الثلاثة الأولى دون أي تغيير في الكود. وهي تكمّل خيارات الجلسة المشروحة في حماية فيديوهاتك.
السقف الصادق ينطبق هنا أيضًا: لا شيء من هذا يجعل التنزيل أو تسجيل الشاشة مستحيلًا. هذه العناصر تحدد أين يُسمح ببدء التشغيل، وترفع الجهد المطلوب على الآخرين.
التشغيل المباشر
المفتاح الرئيسي للتشغيل المجهول. ما دام مفعّلًا (الوضع الافتراضي) فإن أي فيديو
تجعله public أو unlisted يعمل على صفحة المشاهدة المستضافة وفي تضمينات
iframe وعبر oEmbed.
أوقفه فيُظلم السطح المجهول كله لهذا المشروع — تعرض الصفحات المستضافة «غير
متاح» ويرفض إصدار جلسات التضمين، تمامًا كما لو كانت كل الفيديوهات خاصة. تبقى
الجلسات التي يصدرها خادمك عبر playback.createSession تعمل، فلا يخسر موقع
الأعضاء شيئًا.
النطاقات المسموح بها والمحظورة
قائمتان من النطاقات تُفحصان مقابل الصفحة التي تضمّن فيديوك أو تشير إليه:
- النطاقات المسموح بها — عندما تكون القائمة غير فارغة، هذه المواقع وحدها يمكنها تشغيل فيديوهاتك. القائمة الفارغة تسمح لكل المواقع.
- النطاقات المحظورة — تُرفض دائمًا، وتُفحص قبل قائمة السماح.
*.example.com يطابق كل النطاقات الفرعية و example.com نفسه. يمكنك لصق
رابط كامل — يُخزَّن https://app.example.com/courses باعتباره
app.example.com.
تفصيلان يستحقان المعرفة:
- عند ضبط قائمة سماح تُرفض أيضًا الطلبات التي تصل دون صفحة مُحيلة إطلاقًا. المتصفحات ترسل المُحيل دائمًا للمشغّلات المضمّنة، فلا يتأثر المشاهدون الحقيقيون؛ أمّا الكاشطات التي تحذف المُحيل فليست مشاهدين حقيقيين.
- معايناتك من لوحة التحكم مستثناة — يمكنك دائمًا مشاهدة فيديوهاتك وأنت مسجّل الدخول مهما قالت القوائم.
تصبح القوائم أيضًا القيمة الافتراضية لـ referrerAllowlist للجلسات التي يصدرها
خادمك بمفتاح API. تمرير referrerAllowlist صريح في createSession يتجاوز
قائمة المشروع لتلك الجلسة؛ وتمرير [] يستثنيها كليًا.
حظر الوصول المباشر لروابط الملفات
عند التفعيل تُرفض طلبات الوسائط التي لا تحمل ترويسة Referer إطلاقًا — الروابط
الملصوقة في تبويب فارغ، ومديرو التنزيل، ومعظم الجالبات المبرمجة. يستمر التشغيل
من صفحة حقيقية لأن الصفحات تُحيل طلبات وسائطها دائمًا.
مصادقة رمز التضمين
البوابة الأقوى: عند تفعيلها لا يعمل المشغّل المضمّن إلا إذا حمل رابط التضمين رمزًا وقّعه خادمك. لا يستطيع أحد بدء التشغيل من رابط لم تولّده أنت — حتى لو كان معرّف الفيديو بيده.
تعرض لوحة التحكم مفتاح رمز التضمين لمشروعك (قابل للتدوير في أي وقت). وقّع هكذا:
token = hex( HMAC-SHA256( key, videoId + "|" + expires ) )
expires = ثواني يونكس عندما يتوقف الرابط عن العملثم أضف الاثنين إلى رابط المشاهدة أو التضمين المستضاف:
https://cdn.videohati.com/embed/VIDEO_ID?token=TOKEN&expires=1900000000Node
import { createHmac } from "node:crypto";
function signEmbedUrl(videoId: string, key: string, ttlSeconds = 3600): string {
const expires = Math.floor(Date.now() / 1000) + ttlSeconds;
const token = createHmac("sha256", key)
.update(`${videoId}|${expires}`)
.digest("hex");
return `https://cdn.videohati.com/embed/${videoId}?token=${token}&expires=${expires}`;
}PHP
function signEmbedUrl(string $videoId, string $key, int $ttlSeconds = 3600): string
{
$expires = time() + $ttlSeconds;
$token = hash_hmac('sha256', $videoId . '|' . $expires, $key);
return "https://cdn.videohati.com/embed/{$videoId}?token={$token}&expires={$expires}";
}دوّر المفتاح من لوحة التحكم متى شككت في تسريبه: تتوقف الرموز الموقّعة بالمفتاح القديم عن العمل فورًا، وكل رابط تضمين تولّده بعدها يجب أن يستخدم المفتاح الجديد.
ماذا تجمع معًا
| الهدف | عناصر التحكم |
|---|---|
| «موقعي وحده يضمّن فيديوهاتي» | النطاقات المسموح بها |
| «موقع بعينه يسرق التضمينات» | النطاقات المحظورة |
| «لا ربط مباشر لملفات الفيديو» | حظر الوصول المباشر لروابط الملفات |
| «أعضاء تطبيقي المسجّلون فقط» | مصادقة رمز التضمين مع expires قصير |
| «لا شيء عام إطلاقًا» | إيقاف التشغيل المباشر + جلسات من الخادم |