没有连接的多字节mysql_real_escape_string?

时间:2011-02-03 23:17:19

标签: php mysql escaping

让我们考虑一下

SET NAMES 'utf8'

到mysql连接(所以我需要多字节转义)。

是否有一个安全的替代mysql_real_escape_string并不需要mysql连接?

在官方页面中,我发现comment使用str_replace,如下所示:

if(!empty($inp) && is_string($inp)) { 
    return str_replace(array('\\', "\0", "\n", "\r", "'", '"', "\x1a"),
                       array('\\\\', '\\0', '\\n', '\\r', "\\'", '\\"', '\\Z') , $inp); 
} 

这够了吗?

为什么mysql_real_escape_string需要当前的charcaterset,如果它只会逃避相同的值? (如官方页面php.net/mysql_real_escape_string中所述)

感谢

3 个答案:

答案 0 :(得分:1)

首先,有很多数据库抽象库

(我之前使用过dbFacile:https://github.com/alanszlosek/dbFacile)。

同样sql准备的语句总是是一个好主意。

但是对于你的实际问题......

来自这篇文章:Alternative to mysql_real_escape_string without connecting to DB

我真的认为这是一个很好的选择:

public function escape($string) {
    $return = '';
    for($i = 0; $i < strlen($string); ++$i) {
        $char = $string[$i];
        $ord = ord($char);
        if($char !== "'" && $char !== "\"" && $char !== '\\' && $ord >= 32 && $ord <= 126)
            $return .= $char;
        else
            $return .= '\\x' . dechex($ord);
    }
    return $return;
}

答案 1 :(得分:0)

答案 2 :(得分:0)

你应该使用mysql_real_escape_string。当你自己制作一个过滤器时,黑客总是有机会解决这个问题。另一方面,Mysql_real_escape_string始终是最新的。如果这就是你的意思,建立一个mysql连接并没有多大用处。我的大多数网站都会在每次网页浏览时建立连接,并且它们仍在运行;)