协慌网

登录 贡献 社区

用 PHP 清理用户输入的最佳方法是什么?

是否有一个 catchall 函数适用于清理 SQL 注入和 XSS 攻击的用户输入,同时仍允许某些类型的 html 标记?

答案

这是一种常见的误解,即用户输入可以被过滤。 PHP 甚至还有一个(现已弃用的)“功能”,称为魔术引号,它建立在这个想法的基础之上。这是胡说八道。忘记过滤(或清洁,或任何人称之为)。

为了避免出现问题,你应该做的很简单:每当你在外国代码中嵌入一个字符串时,你必须根据该语言的规则来逃避它。例如,如果在某些 SQL 目标 MySql 中嵌入字符串,则必须为此目的使用 MySql 函数转义字符串( mysqli_real_escape_string )。 (或者,对于数据库,如果可能,使用预处理语句是更好的方法)

另一个例子是 HTML:如果在 HTML 标记中嵌入字符串,则必须使用htmlspecialchars对其进行转义。这意味着每个echoprint语句都应该使用htmlspecialchars

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

等等等等 ...

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

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

相反, 不要在创建 SQL 代码时使用数据 。使用使用绑定变量的 Prepared Statements(即使用模板查询中的参数)。这是防止 SQL 注入的唯一方法。

有关阻止 SQL 注入的更多信息,请访问我的网站http://bobby-tables.com/

不可以。如果没有任何上下文,您无法对数据进行一般过滤。有时您想要将 SQL 查询作为输入,有时您希望将 HTML 作为输入。

您需要过滤白名单上的输入 - 确保数据符合您期望的某些规格。然后,您需要在使用它之前将其转义,具体取决于您使用它的上下文。

转义 SQL 数据的过程 - 防止 SQL 注入 - 与转换(X)HTML 数据的过程非常不同,以防止 XSS。