大家伙们都经常用mysql_real_escape_string,我有个疑问,这个函数是不是只有开了mysql扩展才能用,如果我用的是oracle数据库呢。我没开mysql_real_escape_string,我怎么办。我查了一下php.net,有如下函数,基本上都是针对 每一个数据库的。我的问题:有没有一个通用的mysql_real_escape_string,这个样子的呢?mysql_real_escape_string
maxdb_real_escape_string
ingres_escape_string
cubrid_real_escape_string
pg_escape_string
mysql_escape_string
maxdb_escape_string
dbx_escape_string
db2_escape_string
mysqli_escape_string
sqlite_escape_string还有一个问题是:mysql_real_escape_string能完全防止SQL注入吗?

解决方案 »

  1.   

    弄明白 mysql_real_escape_string的功效你完全可以用正则之类的方法来实现,至于是不是要装了扩展才能用我不清楚。第2个问题
    mysql_real_escape_string函数转义 SQL 语句中使用的字符串中的特殊字符,不是用来针对SQL注入攻击的.所以你的问题就有答案了.
    不能说用了转义就100%的安全,我前段时间看到有说将'转成16进制的,然后到了mysql却能正常识别。当然我自己没去测试过这个说法是否真的可行,但要相信那些骇客每天削尖了脑袋在想这些。打算最近写个帖子大家一起来讨论这个令人烦恼的问题.
      

  2.   

    我很期待你的帖子,phpNewnew。关于防注入pdo参数化查询,这个效果如何?mysql_real_escape_string在www.php.net的例子代码上,他们就是用这个函数来防止 值中有特殊字符导致语句不能正常执行的,这个到是很常见,你说意思我懂了。最后不好意思,有没现成的mysql_real_escape_string的模拟函数,发过来一个。或者像zend,thinkphp中有没有现成的,提示一下。
      

  3.   

    对于SQL注入我也是最近在关注,其实并不会比你知道的多,所以希望写个帖子和大家讨论一下,欢迎来指点。这里有一个据说是dz的$magic_quotes_gpc = get_magic_quotes_gpc();
    @extract(daddslashes($_COOKIE));
    @extract(daddslashes($_POST));
    @extract(daddslashes($_GET));
    if(!$magic_quotes_gpc) {
    $_FILES = daddslashes($_FILES);
    }function daddslashes($string, $force = 0) {
    if(!$GLOBALS['magic_quotes_gpc'] || $force) {
    if(is_array($string)) {
    foreach($string as $key => $val) {
    $string[$key] = daddslashes($val, $force);
    }
    } else {
    $string = addslashes($string);
    }
    }
    return $string;
    }
    echo daddslashes('jafoakfok*&%^:"');还有别人写的function str_filter($str){
       $str=htmlspecialchars($str);
       if(!get_magic_quotes_gpc()){
           $str=addslashes($str);
       }
        //过滤危险字符
       return preg_replace("/[\"\'=]|(and)|(or)|(create)|(update)|(alter)|(delete)|(insert)|(count)|(%20)|(char)/i","",$str);
    }网上应该还蛮多的.
      

  4.   

    恩,谢谢。百度百科:http://baike.baidu.com/view/4473279.htm
    这个百科词条很有意思,mysql_real_escape_string 在这里被说成是防注入的典范。
      

  5.   

    mysql的不适用sqlite,sqlite的不适用mysql。
      

  6.   

    1、有 PDO::quote 
    2、不能,这只是让数据顺利入库才设计的
      

  7.   


    经过实验,我发现PDO::Quote总是在字符串两边加上 单引号,这个我很反感,mysql_real_escape_string就绝对不加。难道说PDO::Quote与mysql_real_escape_string区别就在于这两个单引号上,而不在于其它??PDO::Quote实现了mysql_real_escape_string所有功能,还额外送你两单引号,这个我不能理解啊,亲
      

  8.   

    親 PDO::Quote 就是加引號而已...哈哈哈 不是額外贈送.
      

  9.   


    那它是不是实现了 mysql_real_escape_string 功能 呢? 为什么在外面加引号?
      

  10.   

    PDO::Quote
    mysql_real_escape_string都是对特殊字符进行转义
    不同的是:后者只针对 mysql,前者可用于所有的数据库
    注意不同的数据库对于特殊字符和转义后的结果是不同的至于 PDO::Quote 会奉送一对单引号,是有他的考虑的
    这个函数会在动态绑定时被内部调用。而被预处理的 SQL 表达式中的参数是不需要用单引号括起的。但传递给数据库的 SQL 指令却是要有的
      

  11.   


    谢谢 "xuzuning-唠叨"耐心解释 ,我明白了。
    PDO::Quote这个函数对外公开的意义其实并不大,你所指的动态调用我想指的是PDO::BindParam 和PDO::BindValue这两个函数吧,而当我们使用这两个函数的时候我们并不需要显示的去调用PDO::Quote,PHP会自动调用PDO::Quote的。所以只要我们PHP脚本的SQL语句使用的值存在破坏该SQL语句执行的可能,使用PDO的BindVaue或BindParam就可以了。简单的说,就是PDO的参数查询。
      

  12.   

    本帖最后由 xuzuning 于 2012-01-05 15:31:32 编辑
      

  13.   

    mysql_real_escape_string和其它普通escape函数的不同点在于它是编码安全的,会根据你的cient编码
    (用mysql_set_charset设定编码)来分析字串而不是全当ansi处理PDO::Quote加引号是因为在prepare的时候一般写成:
    WHERE calories < ? AND colour = ? 
    这样,字串由quote根据变量类型加上引号,而非字串不会加
      

  14.   


    据说在新的之前,set xxx. 记不清了,新版本有设定字符的方法,以前所有方案已不推荐。mysql_real_escape_string是是编码安全的, 安全级别最高。比addslash之类的都高。 它是编码安全的。
    或者可以这么理解,它可以根据编码来进行转义。 如果更高安全,每次调用数据库函数转义?另外,对于加引号是否一定正确的问题,可能和sql模式有关。 我以前遇到过,对于整型字段,加引号出错。
      

  15.   

    我讨厌 pdo::quote 这个用不上的东西 。
      

  16.   

    记住PDO是企图给数据库提供统一操作界面,这个quote对其它数据库是很有需要的,
    很多数据库都是不让给整型字段加上引号的, 而mysql没问题. 另外quote一般是和prepare同时用的,
    prepare在其它数据库里很普遍, 而mysql用户却不太习惯prepare的好处可以参考这里
    http://www.go4expert.com/forums/showthread.php?t=8074