防止SQL注入数据库类

Joe*_*Joe 5 php mysql sql database security

我正在构建一个数据库类,并认为合并某种形式的SQL注入预防是个好主意(呃!).这是运行数据库查询的方法:

class DB
{
    var $db_host    = 'localhost';
    var $db_user    = 'root';
    var $db_passwd  = '';
    var $db_name    = 'whatever';

    function query($sql)
    {
        $this->result = mysql_query($sql, $this->link);
        if(!$this->result)
        {
           $this->error(mysql_error());
        } else {
            return $this->result;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

课堂上还有更多,但我只是因为这个而削减它.我面临的问题是,如果我只是使用mysql_real_escape_string($sql, $this->link);它然后它会逃避整个查询并导致SQL语法错误.如何动态查找需要转义的变量?我想避免mysql_real_escape_string()在我的主代码块中使用,我宁愿在函数中使用它.

谢谢.

Mar*_*ams 0

防止SQL注入攻击的整体思路是防止用户运行自己的SQL。在这里,看起来你想让用户运行自己的SQL,那么为什么要限制他们呢?

或者,如果您不允许用户将 SQL 传递到 query() 方法中。对于实现转义参数来说,这个级别太低了。正如您所意识到的,您只想转义参数,而不是整个 SQL 语句。

如果对 SQL 进行参数化,则可以仅转义参数。在这种情况下,我假设用户可以影响参数的值,而不是 SQL。

查看 PDObindParam()或 Zend_DB 的query()方法,了解如何在其他数据库接口中实现这一点。