PHP 用户输入数据安全性


PHP user input data security

我试图找出在输入数据和输出数据时在不同情况下最好使用哪些函数。

当我允许用户将数据输入MySQL时,保护数据以防止SQL注入和/或某人可能尝试的任何其他类型的注入或黑客攻击的最佳方法是什么?

当我从数据库中将数据输出为常规 html 时,最好的方法是什么,这样脚本等就无法运行了?

目前我基本上只使用

mysql_real_escape_string(); 

在将数据输入数据库之前,这似乎工作正常,但我想知道这是否是我需要做的,或者其他方法是否更好。

目前我使用

stripslashes(nl2br(htmlentities())) 

(无论如何,大多数时候)用于输出数据。我发现这些工作对于我通常使用它们的工作很好,但是我遇到了html实体的问题,我希望能够分别输出一些html标签,例如:

<ul></ul><li></li><bold></bold> 

等等,但我不能。

任何帮助都会很棒,谢谢。

我同意 mikikg 的观点,即您需要了解 SQL 注入和 XSS 漏洞,然后才能尝试保护应用程序免受这些类型的问题的影响。

但是,我不同意他使用正则表达式来验证用户输入作为SQL注入预防器的断言。是的,请尽可能验证用户输入。但不要依靠这个来防止注入,因为黑客经常破坏这些类型的过滤器。另外,不要对你的过滤器太严格 - 很多网站不会让我登录,因为我的名字中有一个撇号,让我告诉你,当这种情况发生时,这是一个痛苦的**。

您在问题中提到了两种安全问题。第一个是SQL注入。此漏洞是一个"已解决的问题"。也就是说,如果您使用参数化查询,并且从不将用户提供的数据作为参数以外的任何内容传入,则无论发生什么情况,数据库都会为您做"正确的事情"。对于许多数据库,如果使用参数化查询,则没有注入的机会,因为数据实际上并未嵌入在 SQL 中 - 数据以带前缀的长度或沿线的类似 blob 未转义地传递。这比数据库转义函数的性能要高得多,并且更安全。(注意:如果使用在数据库上生成动态 SQL 的存储过程,它们也可能出现注入问题!

您提到的第二个问题是跨站点脚本问题。如果你想允许用户提供 HTML 而不先转义实体,这个问题是一个悬而未决的研究问题。可以说,如果您允许用户传递某些类型的 HTML,那么您的系统很可能会在某个时候遇到 XSS 问题,从而受到确定的攻击者的影响。现在,这个问题的最新技术是使用像HTMLPurifier这样的库来"过滤"服务器上的数据。攻击者可以并且确实会定期破坏这些过滤器;但到目前为止,还没有人找到更好的方法来保护应用程序免受此类事情的影响。您最好只允许特定的 HTML 标记白名单,以及实体编码其他任何内容。

这是

当今最成问题的任务之一:)

您需要了解SQL注入和其他攻击者方法的工作原理。https://www.owasp.org/index.php/Main_Page 中对每种方法都有非常详细的解释,还有PHP的整个安全框架。

使用来自某些框架的特定安全库也是不错的选择,例如在CodeIgniter或Zend中。

接下来,尽可能多地使用 REGEXP,并将模式规则粘附到特定的输入格式。

使用框架的预准备语句或活动记录类。

如果您确实需要数值,请始终使用 (int)$_GET['myvar'] 投射输入。

还有许多其他规则和方法来保护您的应用程序,但一条黄金法则是"永远不要相信用户的输入"。

php配置中,magic_quotes_gpc应该处于关闭状态。所以你不需要stripslashes.

对于 SQL,请查看 PDO 的预准备语句。

对于您的自定义标签,由于只有三个,您可以在调用htmlentities后执行preg_replace调用,以便在将它们插入数据库之前将它们转换回来。