Php 获取值数组上的htmlspecialchars()

Php 获取值数组上的htmlspecialchars(),php,arrays,security,xss,htmlspecialchars,Php,Arrays,Security,Xss,Htmlspecialchars,假设我使用PDO获取数据 $stmt = $this->dbh->prepare("SELECT * FROM posts"); $stmt->execute(); $result = $stmt->fetchAll(); return $result; 在查看页面上使用echo显示结果之前,我应该如何使用htmlspecialchars()?在fetchall()之后转义结果数组可以吗?还是应该在视图页面中逐个转义所有结果 如果我在fetch之

假设我使用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;

fetchAll
返回数组数组。您只内爆外部数组(行),这意味着您正在尝试将内部数组(字段/值)转换为字符串,您将得到文本字符串
数组、数组、数组等。


因此,不,它不会工作。

fetchAll
返回一个数组数组。您只内爆外部数组(行),这意味着您正在尝试将内部数组(字段/值)转换为字符串,您将得到文本字符串
数组、数组、数组等。


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

不管你在这个问题上的解决方案是否真的有效(不像Marc B指出的那样),从技术上讲,你在哪里编码值并不重要,只要它们在写入页面之前被编码。所以这几乎是你的设计决定

让我注意到,htmlspecialchars()并不是反对XSS的圣杯。它仅在将输出写入HTML上下文时保护您,但在将输出写入Javascript(例如)时不提供保护

考虑这一点:

...your html content...
<script type="text/javascript">
    var myvar = <?= myVar ?>;
</script>
...
…您的html内容。。。
var myvar=;
...

在这种情况下,如果myVar可能包含用户输入,那么对其调用htmlspecialchars()是不够的。在上面的示例中,利用XSS实际上不需要任何特殊字符。这同样适用于
之类的事情,不管你在问题中的解决方案是否真的有效(不像Marc B指出的那样),从技术上讲,你在哪里编码值并不重要,只要它们在写入页面之前被编码。所以这几乎是你的设计决定

让我注意到,htmlspecialchars()并不是反对XSS的圣杯。它仅在将输出写入HTML上下文时保护您,但在将输出写入Javascript(例如)时不提供保护

考虑这一点:

...your html content...
<script type="text/javascript">
    var myvar = <?= myVar ?>;
</script>
...
…您的html内容。。。
var myvar=;
...


在这种情况下,如果myVar可能包含用户输入,那么对其调用htmlspecialchars()是不够的。在上面的示例中,利用XSS实际上不需要任何特殊字符。这同样适用于
在视图页面上执行。这是演示文稿的一部分,因此应该在模型、视图、控制器应用程序框架的视图中处理。您使用的是MVC框架,对吗?如果没有,为什么要这么努力呢?找Symfony,让框架来处理这些细节。在Symfony中,有无数种方法可以解决这个问题。是的,我创建了自己的CMS,我想学习,所以我自己做MVC,但一旦我完全理解了这个概念,我绝对会使用一个框架。在你展示的方法中,你用PDO获取数据。我建议不要用那种方法做任何其他事情。不管你是在做MVC还是其他模式,我认为最好遵循单一责任原则。如果您后来意识到您想在输出之前对该方法中的数据执行其他操作(过滤、排序、转换等),该怎么办?如果它已经被
htmlspecialchars
ed,它很容易干扰它。看看主要的框架;它们都使用某种模板系统,在输出时转义输出。感谢您的建议,我将在查看页面上执行此操作。这是演示文稿的一部分,因此应在您的模型、视图、控制器应用程序框架视图中处理。您使用的是MVC框架,对吗?如果没有,为什么要这么努力呢?找Symfony,让框架来处理这些细节。在Symfony中,有无数种方法可以解决这个问题。是的,我创建了自己的CMS,我想学习,所以我自己做MVC,但一旦我完全理解了这个概念,我绝对会使用一个框架。在你展示的方法中,你用PDO获取数据。我建议不要用那种方法做任何其他事情。不管你是在做MVC还是其他模式,我认为最好遵循单一责任原则。如果您后来意识到您想在输出之前对该方法中的数据执行其他操作(过滤、排序、转换等),该怎么办?如果它已经被
htmlspecialchars
ed,它很容易干扰它。看看主要的框架;他们都使用某种模板系统,在输出时对输出进行转义。谢谢你的建议,我会这样做的。那么,你为什么不试试呢?我们很乐意帮忙。我们不是来为您执行/调试代码的。尤其是当你只是在黑暗中闲逛的时候。我学会了不要“思考”。你不知道有些人认为什么会使他们的网站安全。@coder1432,没有一套最好的安全技术。对于给定的环境,它们是成本和您必须防范的威胁之间的折衷。这里我们提到一些可靠的技术,因为您对环境的描述相当完整。请注意-我使用您列表中提到的技术。在我看来,这实际上是在为web编程时以一种稍微偏执的方式进行思考@coder_1432:这对数据库很有帮助。htmlspecialchars与sql无关。你不能只是“使用X让我安全吗?”。你必须问“为目的做X/使用Y会让我安全吗”,然后解释你的威胁环境也是什么。那么使用array_walk可以做到吗?为什么不试试呢?我们很乐意帮忙。我们不是来为您执行/调试代码的。尤其是当你只是在黑暗中闲逛的时候。我学会了不要“思考”。你没有