在Adodb for PHP中清理SQL查询的输入

时间:2011-11-01 03:34:45

标签: php mysql sql-injection input-sanitization filter-var

我正在优化使用ADODBforPHP的平台。我使用了一个清理函数,它避免了以前版本的PHP(mysql_escape_string)的sql注入,这些版本显然不再受支持或推荐。

对于那些没有使用过库的人来说,它是这样的:

$rs = $cnn->Execute('SELECT * FROM user WHERE id_user='.q($_GET['id']));

更新某行时的示例:

$record = array();
$record['name'] = q($_GET['name']);
$record['last_update'] = time();
$rsProfile = $cnn->Execute('SELECT * FROM user WHERE id_user='.q($_GET['id']));
$sql = $cnn->GetUpdateSQL($rsProfile,$record);
if($sql) $cnn->Execute($sql);                            

在这种情况下, q($ string)是清理功能,我正在努力改进。我无权在此服务器中安装PDO,因此这不是一个选项。

当前的q()使用没有第二个参数的mysql_real_escape_string:

function q($data) {
    if(!empty($data) && is_string($data)) {
        $data = str_replace(array('\\', "\0", "\n", "\r", "'", '"', "\x1a"), array('\\\\', '\\0', '\\n', '\\r', "\\'", '\\"', '\\Z'), $data);
        $data = "'".$data."'";
    }
    return $data;
}

有人在另一个论坛上推荐了 filter_var ($ value,FILTER_SANITIZE_STRING),但老实说我没有将这些用于这些事情。

有关如何提高此功能安全性的任何建议吗?

更新1

function q($data) {
    if(is_string($data)) {
        return "'".mysql_real_escape_string($data)."'";
    } elseif(is_numeric($data) || is_bool($data)) {
        return $data;
    } else {
        return "''";
    }
}

2 个答案:

答案 0 :(得分:1)

我很抱歉让你失望,但你的消毒功能无论做什么,都没有“消毒”任何东西,你可以在你发布的代码中注射。
只需这样调用你的脚本

code.php?id=1 union select password from users where id=1

并查看此代码是否“清理了”任何内容。

  

有关如何提高此功能安全性的任何建议吗?

不确定。
首先,您必须了解转义是什么以及如何使用它。

然后你必须开始使用占位符,我相信

答案 1 :(得分:0)

来自mysql_escape_string的{​​{3}}:

  

此功能已弃用,请勿使用此功能。相反,请使用documentation

所以,如果你使用的是mysql,那么mysql_real_escape_string就可以了。