htmlspecialchars()取值数组

时间:2016-09-22 17:13:09

标签: php arrays xss htmlspecialchars

让我说我用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;

2 个答案:

答案 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()我认为是错误的,因为此时您可能不关心数据的使用位置(将写入的上下文)。它也可能是代码中关注事物的分离。

所以我会在实际写入页面之前备用编码数据,因为那样你就知道要使用什么编码了。