• 技术文章 >后端开发 >php教程

    ^mysql_real_escape_string的好有关问题

    2016-06-13 10:12:07原创492
    ^-^mysql_real_escape_string的好问题
    大家伙们都经常用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注入吗?

    ------解决方案--------------------
    弄明白 mysql_real_escape_string的功效你完全可以用正则之类的方法来实现,至于是不是要装了扩展才能用我不清楚。

    第2个问题
    mysql_real_escape_string函数转义 SQL 语句中使用的字符串中的特殊字符,不是用来针对SQL注入攻击的.所以你的问题就有答案了.
    不能说用了转义就100%的安全,我前段时间看到有说将'转成16进制的,然后到了mysql却能正常识别。当然我自己没去测试过这个说法是否真的可行,但要相信那些骇客每天削尖了脑袋在想这些。

    打算最近写个帖子大家一起来讨论这个令人烦恼的问题.
    ------解决方案--------------------
    对于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);
    }

    网上应该还蛮多的.
    ------解决方案--------------------
    mysql的不适用sqlite,sqlite的不适用mysql。
    ------解决方案--------------------
    探讨
    我查了一下php.net,有如下函数,基本上都是针对 每一个数据库的。我的问题:有没有一个通用的mysql_real_escape_string,这个样子的呢?

    还有一个问题是:mysql_real_escape_string能完全防止SQL注入吗?

    ------解决方案--------------------
    親 PDO::Quote 就是加引號而已...哈哈哈 不是額外贈送.

    ------解决方案--------------------
    PDO::Quote
    mysql_real_escape_string

    都是对特殊字符进行转义
    不同的是:后者只针对 mysql,前者可用于所有的数据库
    注意不同的数据库对于特殊字符和转义后的结果是不同的

    至于 PDO::Quote 会奉送一对单引号,是有他的考虑的
    这个函数会在动态绑定时被内部调用。而被预处理的 SQL 表达式中的参数是不需要用单引号括起的。但传递给数据库的 SQL 指令却是要有的


    ------解决方案--------------------
    也不竟然
    PHP code
    $db = new PDO('mysql:dbname=test');$ar = array( 'aa', "b'b", 123);$ar = array_map(array($db, 'Quote'), $ar);echo join(',', $ar);
    ------解决方案--------------------
    mysql_real_escape_string和其它普通escape函数的不同点在于它是编码安全的,会根据你的cient编码
    (用mysql_set_charset设定编码)来分析字串而不是全当ansi处理

    PDO::Quote加引号是因为在prepare的时候一般写成:
    WHERE calories < ? AND colour = ?
    这样,字串由quote根据变量类型加上引号,而非字串不会加
    ------解决方案--------------------
    这问题贴讨论的有意思。
    ------解决方案--------------------

    据说在新的之前,set xxx. 记不清了,新版本有设定字符的方法,以前所有方案已不推荐。

    mysql_real_escape_string是是编码安全的, 安全级别最高。比addslash之类的都高。 它是编码安全的。
    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    相关文章推荐

    • PHP Hyperf 3.0 发布!新功能速览• 详解PHP怎么实现旋转图片验证• 简单理解PHP超级全局变量• 一起聊聊PHP的路由与伪静态应用• PHP中几种常见的开发模式
    1/1

    PHP中文网