取值数组上的 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() 是错误的,因为此时您可能不关心数据将在何处使用(它将写入什么上下文) .它也可能是您代码中的关注点分离。
所以我会保留编码数据,直到它真正写入页面,因为那样你就知道要使用什么编码了。
假设我使用 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() 是错误的,因为此时您可能不关心数据将在何处使用(它将写入什么上下文) .它也可能是您代码中的关注点分离。
所以我会保留编码数据,直到它真正写入页面,因为那样你就知道要使用什么编码了。