---
title: الأمان
description: 'ما يفعله LaRecipe ليمنع محتوى التوثيق من تشغيل كود أو تسريب أسرار، وكيف يطبّق سياسة وصول واحدة على كل الواجهات، ويُبقي الوكلاء و CI للقراءة فقط افتراضيًا، وترويسات التخزين المؤقت التي تحملها كل استجابة.'
url: 'https://larecipe.saleem.dev/ar/3.x/operate/security'
version: 3.x
locale: ar
last_updated: '2026-10-18'
---

> Docs index: https://larecipe.saleem.dev/3.x/llms.txt · MCP: https://larecipe.saleem.dev/mcp · Skill: https://larecipe.saleem.dev/skill.md

# الأمان

محتوى التوثيق بيانات، وليس كودًا أبدًا. تذكر هذه الصفحة ما يضمنه 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](https://larecipe.saleem.dev/ar/3.x/writing/markdown.md#raw-html).
- **تُسقط الروابط غير الآمنة.** روابط `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` فقط، والمضيف المستضاف ذاتيًا للتحليلات لا يُعتمد إلا من الإعدادات. راجع [التحليلات](https://larecipe.saleem.dev/ar/3.x/operate/analytics.md).
- **الظهور يميل إلى الخصوصية عند الشك.** تُقصّ قيمة `visibility` في ترويسة الصفحة أو في إصدار وتُحوَّل إلى أحرف صغيرة، وأي قيمة غير `public` تجعل الصفحة أو الإصدار خاصًا.

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

لا يوجد مكوّن `<Config>` ولا `<Env>`، عن قصد: الصفحة التي تذكر إعدادًا تسمّيه في كود مضمّن. وتبقى تضمينات المقتطفات داخل جذرها، وترفض [الملفات التي قد تحوي أسرارًا](https://larecipe.saleem.dev/ar/3.x/writing/code-blocks.md#what-can-be-included)، وهي القائمة نفسها التي لا يقرؤها وكيل [`larecipe:sync`](https://larecipe.saleem.dev/ar/3.x/keeping-current/sync.md) أبدًا.

**المراجع الحية والتضمينات والمسارات ومسار الملفات**

- **لا تعرض المراجع الحية إلا الشكل العام.** تصف `<Route>` و `<Artisan>` و `<Model>` و `<Event>` طريقة المسار وعنوانه URI وأسماء الوسائط (middleware) فيه، وتوقيع الأمر، وحمولة الحدث ومستمعيه، والنماذج الموجودة فقط في مساحات الأسماء التي يذكرها `references.models.allow`. ويعرض `<Route>` أسماء قواعد طلب النموذج (form request) لكن ليس وسائطها أبدًا، والوسائط من دون معاملاتها، ولا يعرض النطاق أبدًا، ولا يعرض إلا المسارات التي يسمح بها `references.routes.allow` (افتراضيًا، مسارات تطبيقك نفسه، لا مسارات الحزم في `vendor/`). ولا يشغّل المسار أبدًا. ولا يصف `<Artisan>` أبدًا أمرًا مخفيًا، ولا يعرض قيمة افتراضية إلا حين يعلنها `$signature` الخاص بالأمر. راجع [المراجع الحية](https://larecipe.saleem.dev/ar/3.x/writing/live-references.md).
- **تبقى تضمينات المقتطفات داخل جذرها.** لا يُحَل `<<< @/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 أبدًا، في كل الصيغ. وتغطي صفحة [كتل الصلاحيات والتوثيق الخاص](https://larecipe.saleem.dev/ar/3.x/writing/gate-blocks.md) أوضاع الوصول والبوابات (gates) والصفحات الخاصة.

**كيف تصمد السياسة في كل واجهة**

- **من يحق له الدخول** يحدده `access.mode` الخاص بالمجموعة: `public`، أو `auth` (أي مستخدم مسجّل الدخول)، أو `gate` (البوابة `viewLarecipe` لديك). والإصدارات والصفحات الخاصة تحتاج دائمًا إلى البوابة.
- **الصفحة المخفية 404، لا 403 أبدًا**، في كل الصيغ. والاستجابة هي نفسها كما لصفحة غير موجودة، فلا تؤكد قواعد الوصول أبدًا أن صفحة خاصة موجودة، ولا تذكر الاقتراحات في صفحة 404 بصيغة Markdown إلا الصفحات التي يحق للطالب رؤيتها.
- **كتل الصلاحيات تُزال، ولا تُخفى.** كتلة `<Can>` التي لا يحق للقارئ رؤيتها تُنتزع من الصفحة قبل تصييرها، فلا تكون في HTML ولا في Markdown ولا في جدول المحتويات ولا في سجلات البحث التي يحصل عليها.
- **البحث لا يرسل أبدًا ما لا يحق للقارئ رؤيته.** متصفح كل قارئ ينزّل فهرسًا مبنيًا لما يحق له رؤيته، وطلب ملف فهرس قارئ آخر يعيد التوجيه إلى فهرسك. وأداة الترتيب في الخادم تصفّي بالطريقة نفسها. راجع [البحث](https://larecipe.saleem.dev/ar/3.x/operate/search.md).

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

كل استجابة صفحة تذكر كيف يجوز تخزينها مؤقتًا، فلا تسلّم ذاكرة مؤقتة مشتركة أو شبكة 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` |

الصفحة التي تُفتح [برابط مشاركة](https://larecipe.saleem.dev/ar/3.x/writing/gate-blocks.md) ترسل أيضًا `Referrer-Policy: no-referrer`، فلا يتسرّب الرمز الموجود في عنوانها إلى الموقع التالي أبدًا. واستجابة القارئ المسجّل الدخول شخصية في كل الصيغ (HTML، و JSON الذي تجلبه الواجهة، و Markdown)، لأن تنقّلها قد يذكر صفحات لا يراها الزوار أبدًا. وتذكر صفحة [واجهات الوكلاء](https://larecipe.saleem.dev/ar/3.x/agents/surfaces.md) الترويسات الأخرى التي ترسلها كل صفحة.

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

مكوّنات 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`، و[التصدير الثابت](https://larecipe.saleem.dev/ar/3.x/operate/static-export.md) يفرّغه.
- **قيمة nonce لسياسة أمان المحتوى (Content Security Policy)** المضبوطة عبر `LaRecipe::useCspNonce()` تُضاف إلى كل وسم سكربت يطبعه LaRecipe: الواجهة، وخريطة الاستيراد، وامتدادك، وسكربت وضع الألوان، ووسوم التحليلات.

راجع [مكوّنات React المخصّصة](https://larecipe.saleem.dev/ar/3.x/customize/custom-components.md).

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

تقدّم نقطة نهاية 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](https://larecipe.saleem.dev/ar/3.x/agents/mcp.md).

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

فحص CI الاختياري الذي يستطيع `larecipe:install` إضافته يشغّل `larecipe:validate` و `larecipe:affected` على طلبات الـ pull request. لا يشغّل أي وكيل ذكاء اصطناعي، ولا ينفّذ commit ولا push أبدًا، ولا يحتاج إلى أسرار في مجموعة المستودع، فهو آمن على طلبات الـ pull request القادمة من نسخ مشتقة (forks). ورمزه يستطيع قراءة المستودع، وفي وضع التعليق كتابة التعليق، لا غير. راجع [فحص CI](https://larecipe.saleem.dev/ar/3.x/keeping-current/ci-check.md).

## التالي

- [كتل الصلاحيات والتوثيق الخاص](https://larecipe.saleem.dev/ar/3.x/writing/gate-blocks.md): محتوى لكل قارئ، في كل الواجهات.
- [مكوّنات React المخصّصة](https://larecipe.saleem.dev/ar/3.x/customize/custom-components.md): `request()` و `shareUser()` والنموذج البديل.
- [النشر](https://larecipe.saleem.dev/ar/3.x/operate/deployment.md): قائمة التحقق للإنتاج.
