Я понимаю необходимость использования htmlspecialchars, чтобы избежать вывода при отображении на веб-странице.

Я просто задался вопросом, нужно ли мне делать это для КАЖДОЙ части данных, которые я выводю, или только для тех битов данных, которые пользователь может контролировать?

Например, в первом блоке кода ниже нет экранирования, а во втором - все.

Нужно ли мне экранировать даже идентификатор из базы данных и переменную, которая устанавливается только на странице?

Или только переменные, содержащие данные, которые пользователь может редактировать - в примере ниже это будут $ post_label и $ post_content.

Код перед побегом:

while ($row = $stmt->fetch()){

    $post_id =      $row['ID'];
    $post_date =    $row['post_date'];
    $post_content = $row['post_content'];
    $post_label =   $row['post_label'];
    $fld_cat =      $row['fld_cat'];
    $post_day_num = date('N', strtotime($post_date));

    if ($post_day_num > 5) {
        $css = "success";
    } else {
        $css = "info";
    }

    $recent .= "<div class='alert alert-$css'>\n";
    $recent .= "    <div>\n";
    $recent .= "        <strong>" . date('D d-M-Y', strtotime($post_date)) . " | $fld_cat</strong> | \n";
    $recent .= "        <a href='default.php?id=$post_id&amp;mode=edit'>Edit</a> | \n";
    $recent .= "        <a href='default.php?id=$post_id&amp;mode=delete'>Delete</a>\n";
    $recent .= "    </div>\n";
    $recent .= "    <div>$post_content</div>\n";
    $recent .= "</div>\n";

}

Код после выхода:

while ($row = $stmt->fetch()){

    $post_id =      htmlspecialchars($row['ID']);
    $post_date =    htmlspecialchars($row['post_date']);
    $post_content = htmlspecialchars($row['post_content']);
    $post_label =   htmlspecialchars($row['post_label']);
    $fld_cat =      htmlspecialchars($row['fld_cat']);
    $post_day_num = htmlspecialchars(date('N', strtotime($post_date)));

    if ($post_day_num > 5) {
        $css = "success";
    } else {
        $css = "info";
    }

    $recent .= "<div class='alert alert-$css'>\n";
    $recent .= "   <div>\n";
    $recent .= "       <strong>" . date('D d-M-Y', strtotime($post_date)) . " | $fld_cat</strong> | \n";
    $recent .= "       <a href='default.php?id=$post_id&amp;mode=edit'>Edit</a> | \n";
    $recent .= "       <a href='default.php?id=$post_id&amp;mode=delete'>Delete</a>\n";
    $recent .= "   </div>\n";
    $recent .= "   <div>$post_content</div>\n";
    $recent .= "</div>\n";

}
php
0
4532066 28 Апр 2016 в 13:53

2 ответа

Лучший ответ

Короткий ответ заключается в том, что каждый раз, когда вы выводите данные из базы данных в HTML, их следует запускать с помощью этого метода, чтобы они интерпретировались правильно и не нарушали вашу разметку и не вызывали уязвимостей безопасности.

Конечно, если у вас есть полный контроль над выводом - это не повод для беспокойства. Однако основной принцип - никогда не иметь абсолютного контроля.

0
CmdrSharp 28 Апр 2016 в 11:06

Только экранировать ввод пользователя. Идентификаторы или другие данные, поступающие из базы данных или из вашего собственного кода, не могут быть использованы пользователем со злыми умыслами.

Помните, что основной причиной экранирования строк является предотвращение атак межсайтового скриптинга. Ввод, исходящий не от пользователя, не может содержать код XSS.

0
dimlucas 28 Апр 2016 в 11:01