2015-06-10 2 views
1

Просто базовый вопрос для новичков, чтобы понять рассуждения. Почему следует использовать HTML-помощники, доступные в Yii2, или мы не можем просто вводить теги, если мы сильны в наших навыках HTML.yii2 - Зачем использовать yii helpers Html вместо простого ввода

Пример: посещение в основных взглядов ...

<h1><?= Html::encode($this->title) ?></h1> 

Почему я не должен просто ввести ...

<h1>My Title</h1> 

ответ

4

Это действительно зависит от вас.

Но с использованием фреймворков-помощников, виджетами и стилями кодирования вы можете сохранить целостность кода, уменьшить ошибки, ошибки и даже снизить риски безопасности.

Использование вашего примера.

Представьте себе, что $this->title устанавливается на имя пользователя в основной файл макета:

<?php $this->title = $user->name; ?> 

<h1><?= $this->title ?></h1> 

Теперь, давайте представим, что пользователь удалось установить его имя в <script>console.log('I can steal your cookies now!');</script>NotAHacker в регистрационной форме (также потому, что вы решил сохранить непосредственно в базе данных, а не использовать фреймворк).

Это сделает следующее:

<h1><script>console.log('I can steal your cookies now!');</script>NotAHacker</h1> 

И вы увидите только это:

NotAHacker

А в консоли JavaScript появится I can steal your cookies now!

Это большой риск для безопасности ! Плохие люди могут красть ваши файлы cookie, записывать активность, красть пароли и т. Д.

Но это можно легко исправить, используя рамки.

<?php $this->title = $user->name; ?> 

<h1><?= Html::encode($this->title) ?></h1> 

И воздаст:

<h1>&lt;script&gt;console.log(&#39;I can steal your cookies now!&#39;);&lt;/script&gt;NotAHacker</h1> 

И вы увидите:

< скрипт > console.log; (' я могу украсть куки Теперь '!) </script > NotAhacker

Но ничего не будет выполнено!

Итак, в чем смысл?Такие структуры, как Yii2, разрабатывают свои помощники и виджеты, поэтому вы можете доверять им, что при использовании их методов ничего плохого не произойдет, и потому, что если вы когда-нибудь столкнетесь с проблемами кодирования, вам понравятся эти классы помощников). Это имеет решающее значение в производственной среде, когда у вас много переменных, и вы не можете позволить чему-либо проскользнуть через ваши пальцы.

TL; Если вы доверяете своей структуре, используйте их доступные методы каждый раз, когда сможете.

+0

Если я знаю путь к ссылке или изображению и не использую переменные, было бы более эффективно/быстрее просто закодировать тег или ? –

0

Прежде всего, вы бы не использовать динамические title свойства, но hardcode - строка. Во-вторых, если вы используете переменную или свойство для вывода в своем представлении, то использование вспомогательного помощника Html::encode() предотвратит атаки на стороне кросс-скрипта (XSS), потому что любой HTML в переменной будет экранирован до вывода.

+0

Итак, где бы я ни увидел это - Html :: encode ($ this-> title) (все представления, сгенерированные gii), заменить ли я на закодированный заголовок? И если я понимаю вас правильно, я должен использовать помощников по соображениям безопасности, да? Если я делаю регулярный, никакой переменной ссылку или что-то еще, я просто жесткий код? –

0

Это делается для предотвращения атак XSS.

Если данные не для пользовательского клиента, и у вас есть контроль над ним. например id или date, ... Вы можете повторить это безопасно:

<?php 
echo $title; 
?> 

Если ввод данных пользователем, и это что-то, вы должны кодировать его:

<?php 
$title = "<h1><script>alert(1);</script>Hi!</h1>"; 
echo \yii\helpers\Html::encode($title); 
?> 

Выход: «&lt;h1&gt;&lt;script&gt;alert(1);&lt;/script&gt;Hi!&lt;/h1&gt;»
И показать его в браузере: «<h1><script>alert(1);</script>Hi!</h1>» (без выполнения и безопасности)

Но если вы хотите получить данные HTML от пользователей и хотите, чтобы это было безопасно, используйте thi s Код:

<?php 
$title = "<h1><script>alert(1);</script>Hi!</h1>"; 
echo \yii\helpers\HtmlPurifier::process($title); 
?> 

Выход: «<h1>Hi!</h1>»
и показать его в браузере: «Hi!» (выполнить этот код, но вы можете увидеть, удалить script теги и другие что-то это в угрозу безопасности. так что это безопасно.)