mysql_real_escape_string的安全替代品? (PHP)

时间:2010-09-22 16:32:33

标签: php mysql

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

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

我希望能够在将字符串发送到函数

之前安全地转义字符串

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

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

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

myquery("'" . escape_me("My string") . "'");

注意我发送两个撇号 - 未转义,内部有一个转义字符串。出于这个原因,我不能在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;
}

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

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

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

2 个答案:

答案 0 :(得分: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);
  • 只要你使用单字节编码或utf-8,就不需要使用mysql_real_escape_string,所以 mysql_escape_string (不建议使用)或者addslashes就足够了

答案 1 :(得分:0)

我建议传入要转义的值数组,并在转义每个值时使用sprintf()格式化查询。这是我的查询功能的第一部分:

public function querya($query, $args=null){
    //check if args was passed in
    if($args !== null){
        //if an array...
        if(is_array($args)){
            //...escape each value in the args array
            foreach($args as $key=>$value){
                $args[$key] = mysql_real_escape_string($value);
            }
            //add the query to the beginning of the args array
            array_unshift($args, $query);
            //call sprintf with the array as arguments to sprintf
            $query = call_user_func_array("sprintf", $args);
        } else {
            //if args is not an array, then string (single argument passed in).
            $query = sprintf($query, mysql_real_escape_string($args));
        }
    }

    //perform query, other stuff
}