我试图弄清楚在输入数据以及输出数据时,在不同情况下最适合使用哪些功能。
当我允许用户将数据输入MySQL时,什么是保护数据安全的最佳方法,以防止SQL注入和/或其他任何人可能尝试的注入或黑客攻击?
当我从数据库将数据输出为常规html时,执行此操作的最佳方法是什么?
目前,我基本上只使用
mysql_real_escape_string();
在将数据输入数据库之前,这似乎可以正常工作,但是我想知道这是否是我需要做的,或者是否有其他更好的方法。
现在我用
stripslashes(nl2br(htmlentities()))
(无论如何,大部分时间)用于输出数据。我发现这些工具可以正常使用,但是我遇到了htmlentities问题,我希望能够分别输出一些html标签,例如:
<ul></ul><li></li><bold></bold>
等,但我不能。
任何帮助将是巨大的,谢谢。
我同意mikikg的观点,您需要先了解SQL注入和XSS漏洞,然后才能尝试保护应用程序免受这些类型的问题的侵害。
但是,我不同意他的主张,即使用正则表达式来验证用户输入是否是SQL注入阻止程序。是的,请尽您所能验证用户输入。但是不要依靠它来阻止注入,因为黑客经常破坏此类过滤器。另外,对过滤器也不要太严格- 许多网站都不允许我登录,因为我的名字中有一个撇号,并且让我告诉你,这种情况发生时会很痛苦。
您在问题中提到了两种安全问题。第一个是SQL注入。此漏洞是“已解决的问题”。也就是说,如果您使用参数化查询,并且从不将用户提供的数据作为参数传递给其他人,那么无论发生什么情况,数据库都将为您做“正确的事”。对于许多数据库,如果使用参数化查询,则没有注入的机会,因为数据实际上并未真正嵌入SQL中发送- 数据以不带前缀或类似blob的长度沿导线传递。这比数据库转义功能的性能要好得多,并且可以更安全。(注意:如果使用在数据库上生成动态SQL的存储过程,则它们也可能存在注入问题!)
您提到的第二个问题是跨站点脚本问题。如果要允许用户提供HTML,而无需实体先将其转义,则此问题是一个开放的研究问题。可以说,如果您允许用户传递某些类型的HTML,则您的系统很可能在某个时候遭受了确定的攻击者的XSS问题。现在,解决此问题的最新技术是使用HTMLPurifier之类的库来“过滤”服务器上的数据。攻击者可以并且确实会定期破坏这些过滤器;但是到目前为止,还没有人找到一种更好的方法来保护应用程序免受此类情况的侵害。您最好只允许特定的HTML标签白名单,以及对其他任何实体进行编码的实体。