用PHP清理用户输入的最佳方法是什么?
是否有一个catchall函数可以很好地处理SQL注入和XSS攻击的用户输入,同时还允许某些类型的html标记?
用户输入可以被过滤是一个常见的误解。 PHP甚至有一个(现在被弃用的)“功能”,称为魔术引号,建立在这个想法上。 这是无稽之谈。 忘记过滤(或清洁,或任何人称之为)。
为了避免问题,你应该做什么很简单:当你在外部代码中嵌入一个字符串时,你必须根据该语言的规则来逃避它。 例如,如果您在某些针对MySql的SQL中嵌入字符串,则必须为此使用MySql函数( mysqli_real_escape_string
)来转义该字符串。 (或者,在数据库的情况下,如果可能,使用准备好的语句是一种更好的方法)
另一个例子是HTML:如果你在HTML标记中嵌入字符串,你必须使用htmlspecialchars
来转义它。 这意味着每个echo
或print
语句都应该使用htmlspecialchars
。
第三个例子可以是shell命令:如果要将字符串(如参数)嵌入到外部命令中,并使用exec
调用它们,则必须使用escapeshellcmd
和escapeshellarg
。
等等等等 ...
您需要主动过滤数据的唯一情况是,您是否接受预先格式化的输入。 例如。 如果你让你的用户发布HTML标记,你打算在网站上显示。 但是,您应该明智地避免这种情况,因为无论您如何过滤它,它总会是一个潜在的安全漏洞。
不要试图通过清理输入数据来防止SQL注入。
相反, 不要让数据用于创建您的SQL代码 。 使用准备好的语句(即使用模板查询中的参数)使用绑定变量。 这是保证防止SQL注入的唯一方法。
有关防止SQL注入的更多信息,请参阅我的网站http://bobby-tables.com/。
不可以。一般来说,如果没有任何关于它的用途的上下文来过滤数据。 有时候你会希望把SQL查询作为输入,有时候你会想把HTML作为输入。
您需要在白名单上过滤输入 - 确保数据符合您的预期。 然后,在使用它之前,您需要将其转义出来,具体取决于您使用它的上下文。
SQL转义数据的过程 - 防止SQL注入 - 与转义(X)HTML数据的过程非常不同,以防止XSS。
链接地址: http://www.djcxy.com/p/3687.html上一篇: What's the best method for sanitizing user input with PHP?
下一篇: Has reCaptcha been cracked / hacked / OCR'd / defeated / broken?