الفرق بين المراجعتين لصفحة: «Twig/escape»
أسامه-دمراني (نقاش | مساهمات) 1.0: إضافة عنوان الصفحة. |
أسامه-دمراني (نقاش | مساهمات) 2.0 محتوى الصفحة |
||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE: المرشح escape في Twig}}</noinclude>يهرِّب المرشح escape سلسلة نصية باستخدام خطط تعتمد على السياق، وهي تستخدم خطة تهريب HTML افتراضيًا:<syntaxhighlight lang="twig"> | |||
<p> | |||
{{ user.username|escape }} | |||
</p> | |||
</syntaxhighlight>يعرَّف المرشح باسم بديل هو <code>e</code> من أجل التيسير وتوفير الوقت:<syntaxhighlight lang="twig"> | |||
<p> | |||
{{ user.username|e }} | |||
</p> | |||
</syntaxhighlight>يمكن استخدام المرشح escape في سياقات أخرى كذلك غير HTML مستفيدين من وسيط اختياري يعرّف خطة التهريب التي يجب استخدامها:<syntaxhighlight lang="twig"> | |||
{{ user.username|e }} | |||
{# يكافئ #} | |||
{{ user.username|e('html') }} | |||
</syntaxhighlight>انظر كيف يمكن تهريب المتغيرات المدرَجة في شيفرة جافاسكربت:<syntaxhighlight lang="twig"> | |||
{{ user.username|escape('js') }} | |||
{{ user.username|e('js') }} | |||
</syntaxhighlight>يدعم المرشح escape خطط التهريب التالية لمستندات HTML: | |||
* <code>html</code>: يهرب سلسلة نصية لسياق '''متن HTML.''' | |||
* <code>js</code>: تهرب سلسلة نصية لسياق '''جافاسكربت'''. | |||
* <code>css</code>: تهرب سلسلة نصية لسياق CSS. يمكن تطبيق تهريب css على أي سلسلة نصية تُدخل في CSS، وتهرِّب كل شيء عدا الأحرف والأرقام. | |||
* <code>url</code>: تهرب سلسلة نصية لمحدد الموارد الموحد (URI)، ولا يُدخل إلا مكونٌ فرعي. | |||
* <code>html_attr</code>: تهرب سلسلة نصية لسياق '''سمة HTML.''' | |||
لاحظ أن التهريب السياقي في مستندات HTML يصعب تنفيذه، ويتوقف اختيار خطة التهريب المناسبة على عوامل كثيرة، فانظر توثيقًا مثل [https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.md the OWASP prevention cheat sheet] لتعلم المزيد عن الأمر.<blockquote>لاحظ أن المرشح escape يستخدم دالة [https://secure.php.net/htmlspecialchars htmlspecialchars] الخاصة بلغة PHP من أجل خطة تهريب HTML. </blockquote>انتبه عند استخدام التهريب التلقائي إذ أن Twig يحاول ألا يهرب متغيرًا تهريبًا مضاعفًا (double-escape) إذا كانت خطة التهريب التلقائية هي نفسها التي يستخدمها مرشح escape، لكن ذلك لا يعمل عند استخدام متغير ما كخطة تهريب:<syntaxhighlight lang="twig"> | |||
{% set strategy = 'html' %} | |||
{% autoescape 'html' %} | |||
{{ var|escape('html') }} {# لن يهرَّب تهريبًا مضاعفًا #} | |||
{{ var|escape(strategy) }} {# سيهرَّب تهريبًا مضاعفًا #} | |||
{% endautoescape %} | |||
</syntaxhighlight>التهريب التلقائي يجب أن يعطَّل عند استخدام متغير كخطة تهريب:<syntaxhighlight lang="twig"> | |||
{% set strategy = 'html' %} | |||
{% autoescape 'html' %} | |||
{{ var|escape(strategy)|raw }} {# won't be double-escaped #} | |||
{% endautoescape %} | |||
</syntaxhighlight> | |||
== المهرِّبات الخاصة == | |||
تستطيع تعريف مهربات خاصة باستدعاء التابع <code>setEscaper()</code> على نسخة توسيع المهرب، ويجب أن يكون أول وسيط هو اسم المهرب ليستَخدم في استدعاء escape، والثاني يجب أن يكون نوع بيانات PHP قابل للاستدعاء "callable":<syntaxhighlight lang="twig"> | |||
$twig = new \Twig\Environment($loader); | |||
$twig->getExtension(\Twig\Extension\EscaperExtension::class)->setEscaper('csv', 'csv_escaper'); | |||
</syntaxhighlight>عند استدعاء Twig لنوع البيانات callable فإن الأخير يستلم نسخة من بيئة Twig والسلسلة النصية التي يجب تهريبها، ومجموعة محارف (charset).<blockquote>لاحظ أن المهربات لا يمكن تخطيها لأنها تُعد التطبيق الأخير، وكذا من أجل تحسين الأداء.</blockquote> | |||
== الوسائط == | |||
* <code>strategy</code>: خطة التهريب. | |||
* <code>charset</code>: مجموعة محارف السلسلة النصية. | |||
== انظر أيضًا == | |||
* [[Twig/intro|مقدمة عن محرك القوالب Twig.]] | |||
* [[Twig/advanced|توسيع Twig.]] | |||
* [[Twig/internals|المكونات الداخلية لـ Twig.]] | |||
* [[Twig/tags|الوسوم في Twig]] | |||
* [[ Twig/filters|المرشحات في Twig]] | |||
== المصادر == | |||
* [https://twig.symfony.com/doc/3.x/filters/escape.html صفحة توثيق المرشح escape في توثيق Twig الرسمي]. | |||
[[تصنيف:Twig]] | |||
[[تصنيف:Twig Filters]] |
مراجعة 14:36، 2 مايو 2021
يهرِّب المرشح escape سلسلة نصية باستخدام خطط تعتمد على السياق، وهي تستخدم خطة تهريب HTML افتراضيًا:
<p>
{{ user.username|escape }}
</p>
يعرَّف المرشح باسم بديل هو e
من أجل التيسير وتوفير الوقت:
<p>
{{ user.username|e }}
</p>
يمكن استخدام المرشح escape في سياقات أخرى كذلك غير HTML مستفيدين من وسيط اختياري يعرّف خطة التهريب التي يجب استخدامها:
{{ user.username|e }}
{# يكافئ #}
{{ user.username|e('html') }}
انظر كيف يمكن تهريب المتغيرات المدرَجة في شيفرة جافاسكربت:
{{ user.username|escape('js') }}
{{ user.username|e('js') }}
يدعم المرشح escape خطط التهريب التالية لمستندات HTML:
html
: يهرب سلسلة نصية لسياق متن HTML.js
: تهرب سلسلة نصية لسياق جافاسكربت.css
: تهرب سلسلة نصية لسياق CSS. يمكن تطبيق تهريب css على أي سلسلة نصية تُدخل في CSS، وتهرِّب كل شيء عدا الأحرف والأرقام.url
: تهرب سلسلة نصية لمحدد الموارد الموحد (URI)، ولا يُدخل إلا مكونٌ فرعي.html_attr
: تهرب سلسلة نصية لسياق سمة HTML.
لاحظ أن التهريب السياقي في مستندات HTML يصعب تنفيذه، ويتوقف اختيار خطة التهريب المناسبة على عوامل كثيرة، فانظر توثيقًا مثل the OWASP prevention cheat sheet لتعلم المزيد عن الأمر.
لاحظ أن المرشح escape يستخدم دالة htmlspecialchars الخاصة بلغة PHP من أجل خطة تهريب HTML.
انتبه عند استخدام التهريب التلقائي إذ أن Twig يحاول ألا يهرب متغيرًا تهريبًا مضاعفًا (double-escape) إذا كانت خطة التهريب التلقائية هي نفسها التي يستخدمها مرشح escape، لكن ذلك لا يعمل عند استخدام متغير ما كخطة تهريب:
{% set strategy = 'html' %}
{% autoescape 'html' %}
{{ var|escape('html') }} {# لن يهرَّب تهريبًا مضاعفًا #}
{{ var|escape(strategy) }} {# سيهرَّب تهريبًا مضاعفًا #}
{% endautoescape %}
التهريب التلقائي يجب أن يعطَّل عند استخدام متغير كخطة تهريب:
{% set strategy = 'html' %}
{% autoescape 'html' %}
{{ var|escape(strategy)|raw }} {# won't be double-escaped #}
{% endautoescape %}
المهرِّبات الخاصة
تستطيع تعريف مهربات خاصة باستدعاء التابع setEscaper()
على نسخة توسيع المهرب، ويجب أن يكون أول وسيط هو اسم المهرب ليستَخدم في استدعاء escape، والثاني يجب أن يكون نوع بيانات PHP قابل للاستدعاء "callable":
$twig = new \Twig\Environment($loader);
$twig->getExtension(\Twig\Extension\EscaperExtension::class)->setEscaper('csv', 'csv_escaper');
عند استدعاء Twig لنوع البيانات callable فإن الأخير يستلم نسخة من بيئة Twig والسلسلة النصية التي يجب تهريبها، ومجموعة محارف (charset).
لاحظ أن المهربات لا يمكن تخطيها لأنها تُعد التطبيق الأخير، وكذا من أجل تحسين الأداء.
الوسائط
strategy
: خطة التهريب.charset
: مجموعة محارف السلسلة النصية.