PHP用户输入数据安全性

时间:2012-08-09 23:52:59

标签: php sql security html-entities

我正在尝试找出在输入数据和输出数据时最适合在不同情况下使用哪些功能。

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

当我从数据库输出常规html数据时,最好的方法是什么,这样才能运行脚本等?

目前我基本上只使用

mysql_real_escape_string(); 

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

目前我使用

stripslashes(nl2br(htmlentities())) 
用于输出数据的

(大部分时间)。我发现这些工作对我通常使用它们很好,但是我遇到了htmlentities的问题,我希望能够分别输出一些html标签,例如:

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

等,但我不能。

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

3 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:1)

这是今天最棘手的任务之一:)

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

使用某些框架中的特定安全库也是很好的选择,例如CodeIgniter或Zend。

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

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

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

有许多其他规则和方法来保护您的应用程序,但一条黄金法则是“绝不信任用户的输入”。

答案 2 :(得分:0)

php配置中,magic_quotes_gpc应该关闭。所以你不需要stripslashes

对于SQL,请查看PDO's prepared statements

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