mysql_real_escape_string的安全替代品?(PHP)

sam*_*mJL 3 php mysql

我将一个变量传递给执行查询的函数

MySQL连接只发生在函数内部,并在函数内部关闭

我希望能够在将字符串发送到函数之前安全地转义字符串

我不能使用mysql_real_escape_string,因为它需要一个MySQL连接(只在函数内部进行)

我知道简单的答案是在函数内部转义字符串,但我不能这样做,因为我需要发送一些转义字符串,以及字符串的一些非转义部分

例如,我需要运行这样的函数:

myquery("'" . escape_me("My string") . "'");
Run Code Online (Sandbox Code Playgroud)

请注意我发送两个撇号 - 未转义,内部有一个转义字符串.出于这个原因,我无法对myquery函数内的参数进行全面的mysql_real_escape_string.

我找到了以下代码,建议我可以使用它作为mysql_real_escape_string的替代方法:

// escape characters
function escape_me($value) {
    $return = '';
    for($i = 0; $i < strlen($value); ++$i) {
        $char = $value[$i];
        $ord = ord($char);
        if($char !== "'" && $char !== "\"" && $char !== '\\' && $ord >= 32 && $ord <= 126)
            $return .= $char;
        else
            $return .= '\\x' . dechex($ord);
    }
    return $return;
}
Run Code Online (Sandbox Code Playgroud)

我不知道这个函数是否对多字节攻击是安全的,但我想我每次查询时都需要撤消该函数

例如,输入:测试3的"确定"变为数据库中的测试3x27s x22OKx22

所以我的主要问题是:你知道是否还有另一个函数可以作为mysql_real_escape_string的替代品来安全地转义字符?

You*_*nse 5

  • 每次调用此函数时连接都是一个糟糕的主意.一个好的计划应用程序不会有这种奇怪的限制.
  • 你可以使用这样的替换
    myquery("SELECT * FROM table WHERE id = %s","My string");

  • 你可以使用另一种替代方式,一种现代方式:准备好的陈述.它将在许多其他答案中描述.

正如没人发布的那样,这是一个粗略的例子

function fetchAll(){
 $args = func_get_args();
 $query = array_shift($args);
 $stmt = $pdo->prepare($query);
 $stmt->execute($args);
 return $stmt->fetchAll();
}
$a=$db->fetchAll("SELECT * FROM users WHERE status=? LIMIT ?,?",$status,$start,$num);
Run Code Online (Sandbox Code Playgroud)
  • 只要你使用单字节编码或utf-8,就不需要使用mysql_real_escape_string,所以mysql_escape_string(不赞成使用)或者addslashes就足够了

  • `mysql_escape_string`已经[不赞成](http://php.net/manual/en/function.mysql-escape-string.php)(赞成`mysql_real_escape_string`),但除此之外,还有好东西.+1 (2认同)