我理解在网页上显示时需要使用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&mode=edit'>Edit</a> | \n";
$recent .= " <a href='default.php?id=$post_id&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&mode=edit'>Edit</a> | \n";
$recent .= " <a href='default.php?id=$post_id&mode=delete'>Delete</a>\n";
$recent .= " </div>\n";
$recent .= " <div>$post_content</div>\n";
$recent .= "</div>\n";
}
答案 0 :(得分:0)
仅转义用户输入。来自数据库或来自您自己的代码的ID或其他内容不能被具有恶意意图的用户操纵。
请记住,转义字符串的主要原因是为了防止跨站点脚本攻击。不是来自用户的输入不可能包含XSS代码。
答案 1 :(得分:0)
简短的回答是,每当您将数据库中的数据回显到HTML时,都应该通过此方法运行,以便正确解释它并且不会破坏您的标记或导致安全漏洞。
当然,如果你对输出有绝对的控制权 - 这不是必须担心的事情。然而,核心准则是你永远不会有绝对的控制权。