如何防止SQL INJECTION中的站点

时间:2010-12-13 11:12:14

标签: php sql-injection code-injection

我想用PHP和Linux从头开始创建一个网站。 MYSQL使用MVC架构。但根据客户要求,网站必须防止SQL INJECTION和CODE INJECTION。

我需要做的是什么必要的步骤。

OR

哪个是启动网站的最佳框架,可防止SQL INJECTION和CODE INJECTION。

我并没有要求这个创建一个牢记的讨论。我只是想知道哪一个更好,以便我可以从专业人士的指导开始。

谢谢我提前......

8 个答案:

答案 0 :(得分:5)

到目前为止,防止SQL注入的最可靠方法是独占使用mysqli参数化查询,而不是手动构建SQL语句。

它比mysql_real_escape_string()好得多,因为意外忘记使用它的风险较低。

为防止服务器端代码注入,请勿在任何情况下使用eval()

为了防止Javascript注入,请在显示所有用户生成的内容并将其存储在数据库中之前,使用strip_tags()处理所有用户生成的内容。

答案 1 :(得分:3)

立即转发$_GET[]$_POST[]等所有来自mysql_real_escape_string()的输入。

答案 2 :(得分:3)

这两个功能可以帮助您:

function escape($escape)
{
    $escape = mysql_real_escape_string($escape) ;
    return $escape ;
}

function _INPUT($name)
{
    if ($_SERVER['REQUEST_METHOD'] == 'GET') {
        return strip_tags($_GET[$name]);
        }
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        return strip_tags($_POST[$name]);
        }
}

使用escape()函数将所有内容发送到db并使用_INPUT()获取所有表单。你可以为每个$ _POST或$ _GET使用_INPUT函数,除了布尔函数,如空($ _ POST ['name'])或isset($ _ POST ['name'])等。

答案 3 :(得分:1)

在传递字符串参数以构建SQL语句时使用mysql_real_escape_string。这包括您作为字符串处理的数字等参数。

答案 4 :(得分:1)

答案 5 :(得分:0)

使用mysql_real_escape_string

答案 6 :(得分:0)

执行此操作的最佳方法是使用预准备语句,禁止无。这将使您不必自己手动编码和平衡所有内容。 PHP的mysqli内置了它,是迈向这个世界的第一步。请查看PHP manual page

答案 7 :(得分:0)

在将所有用户数据放入数据库之前提供的所有好的技巧之后,你必须在问题的第二面思考。

逃离ouptuts

这意味着应根据此输出格式的规则对应用程序的每个输出进行转义。 例如,当您为HTML页面回显某些内容时,必须通过htmlentites对其进行转义,以便数据中包含的任何HTMl在输出中都不会是html。 对于csv输出,你应该转义引号或逗号,对于JSON你也应该转义,等等,每个输出都有他的规则。

这个东西有时会用来存储数据库中存在潜在危险的数据(js代码,Html代码),只是在插入之前阻止SQL注入。然后确保在输出之前正确转义它。

另一种思维方式是在数据库存储之前阻止任何js或HTML代码,但你仍然应该转义输出(如果是)。

谈到框架,你应该看看Zend_Filter,Zend_Validate上的Zend Framework以及视图上的转义函数。