1

我正在优化一个使用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 "''";
    }
}
4

2 回答 2

2

很抱歉让您失望了,但是您的清理功能,无论它做什么,都不会“清理”任何东西,并且您在此处发布的代码中可能会进行注入。
就这样调用你的脚本

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

看看这段代码是否“清理”了任何东西。

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

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

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

于 2011-11-01T05:54:36.390 回答
0

从以下文档mysql_escape_string

此功能已弃用,请勿使用此功能。相反,使用mysql_real_escape_string()。

因此,如果您使用的是 mysql,则应该可以使用mysql_real_escape_string.

于 2011-11-01T04:07:37.807 回答