小编典典

如何使用 PHP 清理用户输入?

all

是否有一个包罗万象的功能可以很好地清理用户输入以进行 SQL 注入和 XSS 攻击,同时仍然允许某些类型的 HTML 标记?


阅读 107

收藏
2022-02-25

共1个答案

小编典典

用户输入可以被过滤是一个常见的误解。PHP 甚至有一个(现已弃用)“功能”,称为magic-
quotes
,它建立在这个想法之上。这是胡说八道。忘记过滤(或清洁,或任何人们所说的)。

为了避免问题,您应该做的事情非常简单:每当您将一段数据嵌入到外部代码中时,您必须根据该代码的格式规则来处理它。但是您必须了解,此类规则可能过于复杂,无法尝试手动遵循它们。例如,在
SQL 中,字符串、数字和标识符的规则都是不同的。为方便起见,在大多数情况下,此类嵌入都有专用工具。例如,当您需要在 SQL 查询中使用 PHP
变量时,您必须使用准备好的语句,这将负责所有正确的格式/处理。

另一个例子是 HTML:如果你在 HTML
标记中嵌入字符串,你必须用htmlspecialchars.
这意味着每个单独的echoorprint语句都应该使用htmlspecialchars.

第三个示例可能是 shell 命令:如果您要将字符串(例如参数)嵌入到外部命令中,并使用
调用它们exec,那么您必须使用escapeshellcmdand
escapeshellarg

此外,一个非常引人注目的例子是 JSON。规则如此繁多和复杂,以至于您永远无法手动遵循它们。这就是为什么您永远不应该手动创建 JSON
字符串,而始终使用专用函数json_encode()来正确格式化每一位数据。

等等等等 …

您需要主动过滤数据的 唯一 情况是您接受预格式化的输入。例如,如果您让您的用户发布您计划在网站上显示的 HTML
标记。但是,您应该明智地不惜一切代价避免这种情况,因为无论您过滤得多么好,它始终是一个潜在的安全漏洞。

2022-02-25