让我说我用PDO获取数据
$stmt = $this->dbh->prepare("SELECT * FROM posts");
$stmt->execute();
$result = $stmt->fetchAll();
return $result;
在视图页面上使用echo显示结果之前,我应该如何使用htmlspecialchars()?可以在fetchall()之后立即转义结果数组,或者我应该在视图页面中逐个转义所有结果?
如果我在fetch之后立即使用htmlspecialchars(),那么下面会有效吗?
$stmt = $this->dbh->prepare("SELECT * FROM posts");
$stmt->execute();
$result = $stmt->fetchAll();
$results= implode(',', $results);
$results= htmlspecialchars($results);
$results= explode(',', $results);
return $results;
答案 0 :(得分:1)
fetchAll
返回一个数组数组。您只会破坏OUTER数组(行),这意味着您正在尝试将内部数组(字段/值)转换为字符串,并且您将获得文字字符串Array,Array,Array,etc...
所以,不,它不会起作用。
答案 1 :(得分:1)
无论你的问题中的解决方案是否真的有效(它不像Marc B所指出的那样),从技术上讲,只要在编写值之前编码值无关紧要这页纸。所以这几乎是你的设计决定。
让我注意到htmlspecialchars()不是反对XSS的圣杯。它只在输出是在HTML上下文中编写时保护您,但不是在将其写入Javascript时保护您。
考虑一下:
...your html content...
<script type="text/javascript">
var myvar = <?= myVar ?>;
</script>
...
在这种情况下,如果它可能包含用户输入,则在myVar上调用htmlspecialchars()是不够的。在上面的示例中,您实际上不需要任何特殊字符来利用XSS。这同样适用于<div onclick="myFun('something', <?=myVar?>)">
之类的内容 - 因为它仍然是Javascript上下文,您需要不同的编码。
关于XSS的完整教程不适合(我相信不属于)这里的答案,只是想提请注意HTML编码并不总是足够的事实。
话虽如此,在从数据库读取数据后立即应用htmlspecialchars()我认为是错误的,因为此时您可能不关心数据的使用位置(将写入的上下文)。它也可能是代码中关注事物的分离。
所以我会在实际写入页面之前备用编码数据,因为那样你就知道要使用什么编码了。