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

2022-08-30 05:44:20

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


答案 1

一个常见的误解是,用户输入可以被过滤。PHP甚至有一个(现已弃用的)“功能”,称为魔术引号,它建立在这个想法之上。这是无稽之谈。忘记过滤(或清洁,或者人们怎么称呼它)。

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

另一个例子是HTML:如果你在HTML标记中嵌入字符串,你必须用htmlspecialchars转义它。这意味着每个单一或语句都应使用 。echoprinthtmlspecialchars

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

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

等等等等...

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


答案 2

不要尝试通过清理输入数据来防止 SQL 注入。

相反,不要允许在创建 SQL 代码时使用数据。使用使用绑定变量的预准备语句(即在模板查询中使用参数)。这是保证针对SQL注入的唯一方法。

请参阅我的网站 http://bobby-tables.com/,了解有关防止SQL注入的更多信息。


推荐