PHP:恶意输入是否安全?

时间:2013-02-06 23:23:16

标签: php html mysql forms security

我打算将其用于我的用户输入的文本块。当然,我想避免恶意滥用网站。

根据我对MYSQL injectionsXSS的了解,我只允许简单文本,没有HTML标记,没有链接,没有什么特别的纯文本和一些文字链接。

这样就够了吗?

mysql_real_escape_string(strip_tags($_POST['datablock']));

2 个答案:

答案 0 :(得分:4)

绑定SQL参数而不是手动构建SQL字符串也是一种很好的做法(参见xkcd on Little Bobby Tables)。

答案 1 :(得分:4)

简短回答:

答案很长很复杂。

您必须确保针对injection bugs保护您的SQL查询。执行此操作的最佳方法是永远不要将用户数据直接注入查询,而是使用数据库驱动程序的SQL占位符为您执行插入操作。到目前为止,这是最安全的方法。您的查询最终将如下所示:

INSERT INTO table_name (user_id, comment) VALUES (:user_id, :comment)

然后以驱动程序可以正确编码的方式将数据绑定到各种占位符。遵守这一规定可以避免几乎所有的SQL注入问题。

您还必须通过不允许用户将带脚本的任意HTML插入您的网页来保护您的HTML免受XSS attacks的攻击。除非您完全确定此用户内容没有<script>类型标记或JavaScript隐藏到各种元素中,否则您应始终将用户输入呈现为HTML等效的HTML。请注意,这是非常很难正确执行,因为JavaScript根本不限于脚本标记。它可以作为HTML元素的属性出现,甚至可以作为CSS样式定义出现。

此外,您应该从不在新应用程序中使用mysql_query或任何相关功能。默认情况下,这些方法很危险,如果您错过一个变量,将会造成严重伤害。 Automated SQL injection tools有一个可怕的功能列表,这些工具所需要的只是一个未转义的变量。

谢天谢地,mysql_query已被弃用,它会在PHP 5.5.0中生成警告,并将在未来的PHP版本中完全删除。

至少您应该使用PDO进行数据库访问。它支持命名占位符,并且可以非常轻松地审核数据库接口代码,以确保它是安全的。错误将脱颖而出。作为一种安全措施,最好用'INSERT INTO ...'这样的单引号来定义查询字符串,这样如果你犯了一个变量的错误就不会被意外插入,但最终会产生无害的SQL错误。

理想情况下,您应该使用PHP framework来构建应用程序。其中大多数都有安全数据库访问,HTML转义和XSS保护的标准化方法。除非你想花一年时间编写自己的框架,否则你不能自己做。