使用PHP和MySQL创建预处理语句,而不使用mysqli

4
我想知道是否可以使用mysql库而不是mysqli库在PHP和MySQL中创建一个预处理语句。
我在PHP文档中找不到相关内容。
谢谢。
3个回答

6


-1

为什么要使用预处理语句?

如果您担心 SQL 注入,您可以自己编写:

$fname = "Robert'); DROP TABLE students;--";
$lname = "Smith";

$pureSql = "SELECT FROM `users` WHERE `fname` = '$fname'   AND `lname` = '$lname'";
$prepSql = "SELECT FROM `users` WHERE `fname` = :userfname AND `lname` = :userlname";

echo $pureSql, "\n";
echo prepare($prepSql, array('userfname' => $fname, 'userlname' => $lname)), "\n";

function prepare($sql, $params=array()){

    if(strlen($sql) < 2 || count($params) < 1){
        return $sql;
    }

    preg_match_all('/\:[a-zA-Z0-9]+/', $sql, $matches);

    $safeSql = $sql;
    foreach($matches[0] as $arg){
        if(array_key_exists(ltrim($arg, ':'), $params)){
            $safeSql = str_replace($arg, "'" . mysql_real_escape_string($params[ltrim($arg, ':')]) . "'", $safeSql);
        }
    }

    return $safeSql;

} //prepare()

输出结果为:

SELECT FROM users WHERE fname = 'Robert'); DROP TABLE students;--' AND lname = 'Smith' SELECT FROM users WHERE fname = 'Robert\'); DROP TABLE students;--' AND lname = 'Smith'

编辑:忘记了xkcd链接 http://xkcd.com/327/


不错的想法。然而,这个方法 a) 仍然无法让我们访问服务器端的预处理语句,并且 b) 存在一些错误(例如,整数参数(1)被引用为('1'),这可能会导致严格 SQL 的问题)。我猜编写一个无错误的 prepare() 并不是那么容易。 - ax.
1
仅仅替换引号并不能真正预防攻击。除非你真的知道你在做什么(如Monty),否则请不要尝试这样做。 - user999717
1
听起来是好建议,但我需要证据才能确定。请向我们展示一个暴露了此代码漏洞的攻击方法。 - jckdnk111

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接