我必须用htmlspecialchars转义所有输出的变量吗?

时间:2016-04-28 10:53:06

标签: php

我理解在网页上显示时需要使用htmlspecialchars来转义输出。

我只是想知道,我是否需要为我输出的每一条数据执行此操作,或者只需要用户可能控制的那些数据位?

例如,下面的第一个代码块没有转义,第二个代码转义了所有内容。

我是否需要转义数据库中的ID,以及仅在页面中设置的变量?

或者只包含用户可以编辑的数据的变量 - 在下面的示例中,这将是$ 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";

}

2 个答案:

答案 0 :(得分:0)

仅转义用户输入。来自数据库或来自您自己的代码的ID或其他内容不能被具有恶意意图的用户操纵。

请记住,转义字符串的主要原因是为了防止跨站点脚本攻击。不是来自用户的输入不可能包含XSS代码。

答案 1 :(得分:0)

简短的回答是,每当您将数据库中的数据回显到HTML时,都应该通过此方法运行,以便正确解释它并且不会破坏您的标记或导致安全漏洞。

当然,如果你对输出有绝对的控制权 - 这不是必须担心的事情。然而,核心准则是你永远不会有绝对的控制权。