在不使用mysqli的情况下使用PHP和MySQL编写语句

在不使用mysqli的情况下使用PHP和MySQL编写语句,php,mysql,prepared-statement,Php,Mysql,Prepared Statement,我想知道是否有可能使用MySQL库而不是mysqli库用PHP和MySQL创建一个准备好的语句 我在PHP文档中找不到任何内容 谢谢。怎么样 不支持预处理语句的PHP文档(在该页末尾)。支持预处理语句的替代方法是。为什么要使用预处理语句 如果您关心SQL注入,您可以随时推出自己的: $fname = "Robert'); DROP TABLE students;--"; $lname = "Smith"; $pureSql = "SELECT FROM `users` WHERE `fname

我想知道是否有可能使用MySQL库而不是mysqli库用PHP和MySQL创建一个准备好的语句

我在PHP文档中找不到任何内容

谢谢。

怎么样


不支持预处理语句的PHP文档(在该页末尾)。支持预处理语句的替代方法是。

为什么要使用预处理语句

如果您关心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()
$fname=“Robert”);下拉表学生;--”;
$lname=“史密斯”;
$pureSql=“从`users`中选择,其中`fname`='$fname'和`lname`='$lname';
$prepSql=“从`users`中选择,其中`fname`=:userfname和`lname`=:userlname”;
echo$pureSql,“\n”;
echo prepare($prepSql,数组('userfname'=>$fname,'userlname'=>$lname)),“\n”;
函数prepare($sql,$params=array()){
if(strlen($sql)<2 | | count($params)<1){
返回$sql;
}
preg_match_all('/\:[a-zA-Z0-9]+/',$sql,$matches);
$safeSql=$sql;
foreach($arg与[0]匹配){
如果(数组键存在(ltrim($arg,,:'),$params)){
$safeSql=str_replace($arg,“.”。mysql_real_escape_字符串($params[ltrim($arg,“:”)))。“”,$safeSql);
}
}
返回$safeSql;
}//准备()
输出为:

users
中选择,其中
fname
=“Robert”);投球台学生;——”和
lname
=“Smith” 从
users
中选择,其中
fname
=“Robert\”;投球台学生;——”和
lname
=“Smith”


编辑:忘记了xkcd链接

好主意。但是,这a)仍然不允许我们访问服务器端准备好的语句,b)存在错误(例如,int参数(
1
)被引用(
'1'
),这可能会导致严格sql的问题)。我想写一个没有bug的
prepare()
并不是一件小事。简单地替换引号实际上并不能阻止利用漏洞。除非你真的知道自己在做什么(例如,你是蒙蒂),否则请不要尝试这样做。听起来是个好建议,但我需要证据来确定。显示一个暴露此代码中漏洞的漏洞。