انتقل إلى المحتوى فهرس التوثيق لوكلاء الذكاء الاصطناعي (llms.txt)
LaRecipe
3.x

الإصدارات

موضوعات متقدّمةالأمان

الأمان

ما يفعله LaRecipe ليمنع محتوى التوثيق من تشغيل كود أو تسريب أسرار، وكيف يطبّق سياسة وصول واحدة على كل الواجهات، ويُبقي الوكلاء و CI للقراءة فقط افتراضيًا، وترويسات التخزين المؤقت التي تحملها كل استجابة.

حُدّث قراءة 8 دقائق

محتوى التوثيق بيانات، وليس كودًا أبدًا. تذكر هذه الصفحة ما يضمنه LaRecipe، لتراجعه وتعرف أين يبدأ دور الكود الخاص بك:

  • لا يستطيع المحتوى تشغيل كود. يُهرَّب HTML الخام، وتُسقط الروابط غير الآمنة، ولا يُقيَّم Blade أبدًا، ولا تُصيَّر إلا المكوّنات التي سجّلها تطبيقك.
  • لا يستطيع المحتوى قراءة الأسرار. لا يقرأ أي مكوّن قيم الإعدادات أو البيئة، وترفض تضمينات المقتطفات الملفات التي قد تحوي أسرارًا.
  • سياسة وصول واحدة. كل واجهة، من صفحة HTML إلى خادم MCP، تسأل السياسة نفسها، والصفحة التي لا يحق للقارئ رؤيتها غير موجودة بالنسبة إليه.
  • الوكلاء للقراءة فقط افتراضيًا. نقطة نهاية MCP على الويب لا تفعل إلا القراءة، ما لم تفتح أدوات التأليف في مجموعة قاعدة بيانات.
  • لا ذكاء اصطناعي في CI. فحص CI الاختياري لا يفعل إلا القراءة والتبليغ.

في كل قسم أدناه التفاصيل.

لا يستطيع المحتوى تشغيل كود

لا تستطيع الصفحات تشغيل PHP أو حقن سكربتات، أيًا كان المصدر الذي تأتي منه. وتضيف مجموعة قاعدة البيانات فوق ذلك منقّيًا لـ HTML، لأن من يحرّرون في لوحة الإدارة قد يكونون أقل موثوقية من قاعدة الكود لديك.

كيف يبقى المحتوى خاملًا
  • يُهرَّب HTML الخام. يظهر <script> أو <iframe> أو onclick مضمّن في Markdown نصًا. ويجوز لمجموعة المستودع، التي تُراجع صفحاتها في git، أن تسمح بـ HTML الخام بضبط html_input على allow؛ وحتى عندها تبقى الوسوم التي يرشّحها GitHub، مثل <script> و <iframe> و <style>، مُهرَّبة. أما مجموعة قاعدة البيانات فتهرّبه دائمًا، وكل صفحة تُصيّرها تمر أيضًا عبر منقّي HTML، فلا تستطيع ثغرة في أي مكان آخر أن تضع في الصفحة سكربتًا أو معالج أحداث أو عنوان javascript:. راجع Markdown.
  • تُسقط الروابط غير الآمنة. روابط javascript: و vbscript: و file: ومعظم روابط data: في Markdown تفقد وجهتها، وتصل الخصائص (props) التي تحمل URL في المكوّنات (href و src و poster) فارغة حين تستخدم أحد هذه المخططات. ويجب أن تكون الروابط في التنقل وشريط التنقل العلوي والتذييل ورابط المستودع عناوين http أو https أو mailto، أو مسارات في موقعك: أي شيء آخر يُترك خارج كل الصفحات، ويبلّغ عنه larecipe:validate تحت links.unsafe، وترفض مجموعة قاعدة البيانات حفظه.
  • السمات محصورة في قائمة مسموحة. يستطيع النحو {#id .class} أن يضبط id و class، لا غير.
  • لا Blade. لا يُجمَّع Markdown ولا يُقيَّم بوصفه Blade أبدًا. فالعبارة {{ $user->email }} في صفحة نصٌ.
  • المكوّنات محصورة في قائمة مسموحة. لا يُصيَّر الوسم إلا حين يوجد له تعريف PHP: مكوّن مدمج، أو مكوّن سجّله تطبيقك عبر LaRecipe::component(). وأي وسم آخر يصبح نصًا مُهرَّبًا وخطأ components.unknown. وتُفحص الخصائص مقابل التعريف في كل تصيير، ويفحصها larecipe:validate. وتُسقط المكوّنات المدمجة كل خاصية لا تعلن عنها، وكذلك يفعل كل مكوّن في مجموعة قاعدة بيانات، فالقيمة التي يشتقها LaRecipe (عنوان مشغّل فيديو، أو مصدر مخطط) لا تأتي أبدًا من الكاتب. ولا يضمّن Video إلا مشغّلات YouTube و Vimeo و Loom عبر https. ولا يُشحن كود المكوّنات إلا من بناء تطبيقك نفسه، ولا يأتي أبدًا من المحتوى.
  • الإعدادات القادمة من المحتوى تُفحص. تُفحص رموز المظهر ومعرّفات التحليلات مقابل الشكل الذي يجب أن تكون عليه قبل أن تصل إلى الصفحة، ويجب أن يكون سكربت التحليلات المخصّص عنوان https، ولا شيء في larecipe.json يستطيع أن يضيف كودًا مضمّنًا. وتأخذ مجموعة قاعدة البيانات تحليلاتها من config/larecipe.php فقط، والمضيف المستضاف ذاتيًا للتحليلات لا يُعتمد إلا من الإعدادات. راجع التحليلات.
  • الظهور يميل إلى الخصوصية عند الشك. تُقصّ قيمة visibility في ترويسة الصفحة أو في إصدار وتُحوَّل إلى أحرف صغيرة، وأي قيمة غير public تجعل الصفحة أو الإصدار خاصًا.

لا يستطيع المحتوى قراءة الأسرار

لا يوجد مكوّن <Config> ولا <Env>، عن قصد: الصفحة التي تذكر إعدادًا تسمّيه في كود مضمّن. وتبقى تضمينات المقتطفات داخل جذرها، وترفض الملفات التي قد تحوي أسرارًا، وهي القائمة نفسها التي لا يقرؤها وكيل larecipe:sync أبدًا.

المراجع الحية والتضمينات والمسارات ومسار الملفات
  • لا تعرض المراجع الحية إلا الشكل العام. تصف <Route> و <Artisan> و <Model> و <Event> طريقة المسار وعنوانه URI وأسماء الوسائط (middleware) فيه، وتوقيع الأمر، وحمولة الحدث ومستمعيه، والنماذج الموجودة فقط في مساحات الأسماء التي يذكرها references.models.allow. ويعرض <Route> أسماء قواعد طلب النموذج (form request) لكن ليس وسائطها أبدًا، والوسائط من دون معاملاتها، ولا يعرض النطاق أبدًا، ولا يعرض إلا المسارات التي يسمح بها references.routes.allow (افتراضيًا، مسارات تطبيقك نفسه، لا مسارات الحزم في vendor/). ولا يشغّل المسار أبدًا. ولا يصف <Artisan> أبدًا أمرًا مخفيًا، ولا يعرض قيمة افتراضية إلا حين يعلنها $signature الخاص بالأمر. راجع المراجع الحية.
  • تبقى تضمينات المقتطفات داخل جذرها. لا يُحَل <<< @/path إلا داخل snippets.root: المسار الأساسي لتطبيقك في مجموعات المستودع، ولا شيء على الإطلاق في مجموعات قاعدة البيانات ما لم تضبط جذرًا. وحتى داخل الجذر، تُرفض المسارات التي تبدأ بنقطة مثل .env، و config/ و storage/ و vendor/، والمفاتيح، وبيانات الاعتماد، وقواعد البيانات، والنسخ المفرَّغة، والسجلات. والتضمين المرفوض يعرض تحذيرًا مكانه وخطأ snippets.denied. وتُتتبَّع الروابط الرمزية إلى المكان الحقيقي للملف، وتُفحص هناك.
  • المسارات لا تغادر مجلدها أبدًا. تُحَل الصفحات وملفات التوثيق وملفات واجهة LaRecipe نفسها إلى مساراتها الحقيقية، وتُرفض حين تقع خارج جذرها، فلا يصل ../ في عنوان أو رابط إلى أي شيء.
  • مسار الملفات لا يقدّم إلا ملفات التوثيق. لا يقدّم /{prefix}/_assets/... أبدًا مصدر Markdown لصفحة (.md، بأي حالة أحرف)، ولا larecipe.json، ولا navigation.json، ولا ملفًا يبدأ بنقطة، ولا ملفًا من نوع مجهول، وكل ملف يخرج مع X-Content-Type-Options: nosniff. وملفات الإصدار الخاص تحتاج إلى الوصول نفسه الذي تحتاج إليه صفحاته. والمسار محدود لكل قارئ بحسب assets.rate_limit (600 طلب في الدقيقة افتراضيًا).

سياسة وصول واحدة

كل واجهة تسأل السياسة نفسها إن كان يحق للقارئ رؤية صفحة: صفحة HTML، ونسختها بصيغة Markdown، و JSON التنقل، و llms.txt، و llms-full.txt، و skill.md، وخريطة الموقع، والبحث، و MCP، و Ask AI، وتقييم الصفحات. والصفحة المخفية تجيب بـ 404، لا بـ 403 أبدًا، في كل الصيغ. وتغطي صفحة كتل الصلاحيات والتوثيق الخاص أوضاع الوصول والبوابات (gates) والصفحات الخاصة.

كيف تصمد السياسة في كل واجهة
  • من يحق له الدخول يحدده access.mode الخاص بالمجموعة: public، أو auth (أي مستخدم مسجّل الدخول)، أو gate (البوابة viewLarecipe لديك). والإصدارات والصفحات الخاصة تحتاج دائمًا إلى البوابة.
  • الصفحة المخفية 404، لا 403 أبدًا، في كل الصيغ. والاستجابة هي نفسها كما لصفحة غير موجودة، فلا تؤكد قواعد الوصول أبدًا أن صفحة خاصة موجودة، ولا تذكر الاقتراحات في صفحة 404 بصيغة Markdown إلا الصفحات التي يحق للطالب رؤيتها.
  • كتل الصلاحيات تُزال، ولا تُخفى. كتلة <Can> التي لا يحق للقارئ رؤيتها تُنتزع من الصفحة قبل تصييرها، فلا تكون في HTML ولا في Markdown ولا في جدول المحتويات ولا في سجلات البحث التي يحصل عليها.
  • البحث لا يرسل أبدًا ما لا يحق للقارئ رؤيته. متصفح كل قارئ ينزّل فهرسًا مبنيًا لما يحق له رؤيته، وطلب ملف فهرس قارئ آخر يعيد التوجيه إلى فهرسك. وأداة الترتيب في الخادم تصفّي بالطريقة نفسها. راجع البحث.

الاستجابات والذاكرات المؤقتة المشتركة

كل استجابة صفحة تذكر كيف يجوز تخزينها مؤقتًا، فلا تسلّم ذاكرة مؤقتة مشتركة أو شبكة CDN صفحة قارئ إلى قارئ آخر أبدًا:

الاستجابة Cache-Control أيضًا
صفحة عامة، لزائر public, max-age=60, s-maxage=600 Vary: Accept، و ETag
صفحة عامة تحمل رمز CSRF، أو أي صيغة يحصل عليها قارئ مسجّل الدخول من صفحة عامة private, no-cache Vary: Accept, Cookie، و ETag لا يطابق أبدًا ما يحصل عليه الزائر
صفحة في مجموعة ليست public، أو صفحة أو إصدار خاص، أو صفحة فُتحت برابط مشاركة، أو صفحة منحت كتلُ الصلاحيات فيها هذا القارئَ شيئًا لا يحصل عليه الزوار private, no-store X-Robots-Tag: noindex، ومن دون ETag
صفحة عامة فيها كتل صلاحيات، تُقدَّم لزائر public, max-age=60, s-maxage=600 Vary: Accept, Cookie
صفحة فيها noindex: true في ترويستها بلا تغيير X-Robots-Tag: noindex

الصفحة التي تُفتح برابط مشاركة ترسل أيضًا Referrer-Policy: no-referrer، فلا يتسرّب الرمز الموجود في عنوانها إلى الموقع التالي أبدًا. واستجابة القارئ المسجّل الدخول شخصية في كل الصيغ (HTML، و JSON الذي تجلبه الواجهة، و Markdown)، لأن تنقّلها قد يذكر صفحات لا يراها الزوار أبدًا. وتذكر صفحة واجهات الوكلاء الترويسات الأخرى التي ترسلها كل صفحة.

المكوّنات المخصّصة

مكوّنات React الخاصة بك تعمل بصلاحيات تطبيقك، لذا يُبقي LaRecipe مداها صغيرًا: request() لا يستدعي إلا مساراتك أنت، ولا تصل أي بيانات مستخدم إلى المتصفح ما لم تشاركها، ولا تُخزَّن رموز CSRF مؤقتًا أبدًا.

request() و shareUser() و CSRF وقيم nonce لسياسة CSP
  • request() لا يستدعي إلا مساراتك أنت. يرفض أي عنوان على مصدر (origin) آخر، ويرسل ملف تعريف الارتباط الخاص بالجلسة ورمز XSRF من Laravel، ويمرّ عبر مساراتك ووسائطك كأي طلب آخر.
  • لا تصل أي بيانات مستخدم إلى المتصفح ما لم تشاركها عبر LaRecipe::shareUser()، الذي يختار الحقول: LaRecipe::shareUser(fn ($user) => ['name' => $user->name]).
  • لا تُخزَّن رموز CSRF مؤقتًا أبدًا. الصفحات المُصيَّرة تُخزَّن وتُشارَك بين القرّاء، لذا يطبع النموذج البديل LaRecipe::csrfField()، وهو عنصر نائب يملؤه LaRecipe برمز القارئ نفسه في كل استجابة. والاستجابة التي تحمل رمزًا كهذا تُعلَّم private، والتصدير الثابت يفرّغه.
  • قيمة nonce لسياسة أمان المحتوى (Content Security Policy) المضبوطة عبر LaRecipe::useCspNonce() تُضاف إلى كل وسم سكربت يطبعه LaRecipe: الواجهة، وخريطة الاستيراد، وامتدادك، وسكربت وضع الألوان، ووسوم التحليلات.

راجع مكوّنات React المخصّصة.

الوكلاء للقراءة فقط افتراضيًا

تقدّم نقطة نهاية MCP على الويب لكل مجموعة أدوات القراءة و submit_feedback، عبر سياسة الوصول، مع حد للطلبات. ولا تعمل أدوات التأليف أبدًا على الويب لمجموعة مستودع، وفي مجموعة قاعدة البيانات لا تعمل إلا حين تفعّلها لمن تسمح لهم البوابة manageLarecipe لديك.

ما الذي يحق لكل خادم MCP فعله
  • نقطة نهاية MCP على الويب لكل مجموعة تقدّم أدوات القراءة (search_docs و read_page و list_pages) و submit_feedback، التي تطلق حدثًا ولا تخزّن شيئًا. وكل استدعاء يمر عبر سياسة الوصول بهوية المستدعي، ونقطة النهاية محدودة بحسب mcp.web.rate_limit. ولتقدّم التوثيق الخاص للوكلاء، ضع مصادقة أمامها عبر mcp.web.middleware، مثل ['auth:sanctum'].
  • validate_docs تقرأ كل الصفحات، والخاصة منها أيضًا، لذا لا تعرضها نقطة النهاية عبر الويب إلا على من تسمح لهم البوابة manageLarecipe لديك.
  • أدوات التأليف لا تعمل أبدًا على الويب لمجموعة مستودع: فمكان تغييراتها هو git. وفي مجموعة قاعدة البيانات لا تظهر إلا حين تفعّل mcp.web.author_tools، وعندها فقط لمستدعٍ مسجّل الدخول تسمح له البوابة manageLarecipe.
  • خادم MCP المحلي (php artisan larecipe:mcp) فيه أدوات التأليف. يعمل على جهازك، باسمك، لوكيل البرمجة الذي شغّلته.

راجع خادم MCP.

لا ذكاء اصطناعي في CI

فحص CI الاختياري الذي يستطيع larecipe:install إضافته يشغّل larecipe:validate و larecipe:affected على طلبات الـ pull request. لا يشغّل أي وكيل ذكاء اصطناعي، ولا ينفّذ commit ولا push أبدًا، ولا يحتاج إلى أسرار في مجموعة المستودع، فهو آمن على طلبات الـ pull request القادمة من نسخ مشتقة (forks). ورمزه يستطيع قراءة المستودع، وفي وضع التعليق كتابة التعليق، لا غير. راجع فحص CI.

التالي

النشرة البريدية

ابقَ على اطلاع

ملاحظات إصدارات LaRecipe عبر البريد الإلكتروني. يمكنك إلغاء الاشتراك في أي وقت.