1

我试图弄清楚在输入数据以及输出数据时哪些函数最适合在不同情况下使用。

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

当我从数据库将数据作为常规 html 输出时,执行此操作的最佳方法是什么,因此脚本等无法运行?

目前我基本上只用

mysql_real_escape_string(); 

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

而此刻我使用

stripslashes(nl2br(htmlentities())) 

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

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

等等,但我不能。

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

4

3 回答 3

3

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

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

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

The second problem you mention is the cross site scripting problem. If you want to allow the user to supply HTML without entity escaping it first, this problem is an open research question. Suffice to say that if you allow the user to pass some kinds of HTML, it's entirely likely that your system will suffer an XSS problem at some point to a determined attacker. Now, the state of the art for this problem is to "filter" the data on the server, using libraries like HTMLPurifier. Attackers can and do break these filters on a regular basis; but as of yet nobody has found a better way of protecting the application from these kinds of things. You may be better off only allowing a specific whitelist of HTML tags, and entity encoding anything else.

于 2012-08-10T01:59:34.137 回答
1

这是当今最有问题的任务之一 :)

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

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

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

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

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

有很多其他规则和方法可以保护您的应用程序,但其中一条黄金法则是“永远不要相信用户的输入”。

于 2012-08-10T00:28:05.037 回答
0

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

对于 SQL,请查看PDO 的prepared statements

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

于 2012-08-10T00:07:09.633 回答