取值数组上的 htmlspecialchars()

htmlspecialchars() on array of values fetch

假设我使用 PDO 获取数据

$stmt = $this->dbh->prepare("SELECT * FROM posts");
    $stmt->execute();
    $result = $stmt->fetchAll();
    return $result;

在视图页面上使用回显显示结果之前,我应该如何使用htmlspecialchars()?在 fetchall() 之后立即转义结果数组是否可以,或者我应该在视图页面中将所有结果一一转义?

如果我在获取后立即使用 htmlspecialchars(),下面的操作是否有效?

$stmt = $this->dbh->prepare("SELECT * FROM posts");
    $stmt->execute();
    $result = $stmt->fetchAll();
    $results=  implode(',', $results);
    $results= htmlspecialchars($results);
    $results= explode(',', $results);
    return $results;

fetchAll returns 数组的数组。您仅内爆了外部数组(行),这意味着您正在尝试将内部数组(fields/values)转换为字符串,并且您将获得文字字符串 Array,Array,Array,etc....

所以,不,这是行不通的。

不管你在问题中的解决方案是否真的有效(它不像 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() 是错误的,因为此时您可能不关心数据将在何处使用(它将写入什么上下文) .它也可能是您代码中的关注点分离。

所以我会保留编码数据,直到它真正写入页面,因为那样你就知道要使用什么编码了。