我将变量传递给执行查询的函数
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的替代方法来安全地转义字符?
答案 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);
答案 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
}