الفرق بين المراجعتين ل"Twig/escape"

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

المراجعة الحالية بتاريخ 14:57، 11 مايو 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: مجموعة محارف السلسلة النصية.

انظر أيضًا

المصادر