概述:

addslashes和mysql_real_escape_string.都是为了使数据安全的插入到数据库中而进行过滤.

addslashes

转义的字符是单引号(')、双引号(")、反斜线(\)与NUL(NULL 字符)。

mysql_real_escape_string

mysql_real_escape_string转义的字符并没有被提到.只是说了一句
注意: mysql_real_escape_string() 并不转义% 和_。
为什么PHP手册没有说呢?因为其实这是个MySql的C的API.所以我们需要查下MySql手册..上面是这么说的.

码的字符为NUL (ASCII
0)、'\n'、'\r'、'\'、'''、'"'、以及Control-Z(请参见9.1节,“文字值”)。(严格地讲,MySQL仅需要反斜杠和引号
字符,用于引用转义查询中的字符串。该函数能引用其他字符,从而使得它们在日志文件中具有更好的可读性)。
 
不得不说一句.MySql手册上面的话总是令人费解的..
 
我们为了更深层次的探究这两个函数的不同..还是去看一看PHP的源码吧..
 
这是PHP的addslashes函数..
 
    PHP_FUNCTION(addslashes)
    {
         zval **str;
        if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &str) == FAILURE) {
             WRONG_PARAM_COUNT;
         }
         convert_to_string_ex(str);
        if (Z_STRLEN_PP(str) == 0) {
             RETURN_EMPTY_STRING();
         }
         RETURN_STRING(php_addslashes(Z_STRVAL_PP(str),
                                      Z_STRLEN_PP(str),
                                      &Z_STRLEN_P(return_value), 0
                                      TSRMLS_CC), 0);
    }
 
很显然.它调用了php_addslashes.我们继续看这个函数
 
    PHPAPI char *php_addslashes(char *str, int length, int *new_length, int should_free TSRMLS_DC)
    {
        return php_addslashes_ex(str, length, new_length, should_free, 0 TSRMLS_CC);
    }
 
结果又是是在调用php_addslashes_ex 我们就像在剥洋葱一样..一步一步的接近真理..
 
    PHPAPI char *php_addslashes_ex(char *str, int length, int *new_length, int should_free, int ignore_sybase TSRMLS_DC)
    {
        /* maximum string length, worst case situation */
        char *new_str;
        char *source, *target;
        char *end;
        int local_new_length;
               
        if (!new_length) {
             new_length = &local_new_length;
         }
        if (!str) {
             *new_length = 0;
            return str;
         }
         new_str = (char *) safe_emalloc(2, (length ? length : (length = strlen(str))), 1);
         source = str;
         end = source + length;
         target = new_str;
       
        if (!ignore_sybase && PG(magic_quotes_sybase)) {
            while (source < end) {
                switch (*source) {
                    case '\0':
                         *target++ = '\\';
                         *target++ = '0';
                        break;
                    case '\'':
                         *target++ = '\'';
                         *target++ = '\'';
                        break;
                    default:
                         *target++ = *source;
                        break;
                 }
                 source++;
             }
         } else {
            while (source < end) {
                switch (*source) {
                    case '\0':
                         *target++ = '\\';
                         *target++ = '0';
                        break;
                    case '\'':
                    case '\"':
                    case '\\':
                         *target++ = '\\';
                        /* break is missing *intentionally* */
                    default:
                         *target++ = *source;
                        break; 
                 }
           
                 source++;
             }
         }
       
         *target = 0;
         *new_length = target - new_str;
        if (should_free) {
             STR_FREE(str);
         }
         new_str = (char *) erealloc(new_str, *new_length + 1);
        return new_str;
    }
 
上面的函数已经非常清楚的描述出都要转义哪些字符了..现在我们去看一看mysql_real_escape_string
 
这个不在string.c里了..是在mysql扩展中.
 
    PHP_FUNCTION(mysql_real_escape_string)
    {
         zval *mysql_link = NULL;
        char *str;
        char *new_str;
        int id = -1, str_len, new_str_len;
         php_mysql_conn *mysql;
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|r", &str, &str_len, &mysql_link) == FAILURE) {
            return;
         }
        if (ZEND_NUM_ARGS() == 1) {
             id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
             CHECK_LINK(id);
         }
         ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
         new_str = safe_emalloc(str_len, 2, 1);
         new_str_len = mysql_real_escape_string(&mysql->conn, new_str, str, str_len);
         new_str = erealloc(new_str, new_str_len + 1);
         RETURN_STRINGL(new_str, new_str_len, 0);
    }
 
这个函数并没有像上面的那样剥洋葱..
 
而是直接调用了MySql的C的API.mysql_real_escape_string()..
 
需要注意的是.这个函数在调用mysql_real_escape_string这个API之前.先是判断了是否连接上了数据库
 
CHECK_LINK(id);   //就是这句
 
所以这就意味着mysql_real_escape_string必须是连接数据库之后才能使用.为了证实这一点.
我们来简单的实验下.
 
    <?php
    echo mysql_real_escape_string("fdsafda'fdsa");
 
结果
Warning:
mysql_real_escape_string() [function.mysql-real-escape-string]: Access
denied for user 'ODBC'@'localhost' (using password: NO) in PHPDocument1
on line 2
 
Warning:
mysql_real_escape_string() [function.mysql-real-escape-string]: A link
to the server could not be established in PHPDocument1 on line 2
 
果然报错了..显示没有链接上数据库..
 
好了..总结就先告一段落..
 
我们终于明白为什么那么多开源的程序比如Discuz用addslashes而不用mysql_real_escape_string了.
 
所以呢.以后也就用addslashes好了..暂时可以忘记掉mysql_real_escape_string了

mysql_escape_string 同 mysql_real_escape_string:

不同点:
(1)mysql_real_escape_string()
1)它有两个参数
    • 参数string,必需。规定要转义的字符串。
    • 参数connection,可选。规定 MySQL 连接。如果未规定,则使用上一个连接。
(2)该函数在转义时会考虑当前数据库链接的字符集,mysql_escape_string()没有该功能
(3)在使用它对查询字符串进行转义之前,必须要先建立数据库连接,否则该函数会一直返回bool(false)

(2)mysql_escape_string()只有一个参数string,在使用它之前不需要先建立数据库连接

php对比辨析之 mysql_escape_string & mysql_real_escape_string & addsalshes的更多相关文章

  1. PHP自带防SQL攻击函数区别

    为了防止SQL注入攻击,PHP自带一个功能可以对输入的字符串进行处理,可以在较底层对输入进行安全上的初步处理,也即Magic Quotes.(php.ini magic_quotes_gpc).如果m ...

  2. PHP函数 addslashes() 和 mysql_real_escape_string() 的区别 && SQL宽字节,绕过单引号注入攻击

    首先:不要使用 mysql_escape_string(),它已被弃用,请使用 mysql_real_escape_string() 代替它. mysql_real_escape_string() 和 ...

  3. PHP函数addslashes和mysql_real_escape_string的区别

    转自:http://www.jb51.net/article/49205.htm   这篇文章主要介绍了PHP函数addslashes和mysql_real_escape_string的区别,以及一个 ...

  4. PHP防SQL注入不要再用addslashes和mysql_real_escape_string

    PHP防SQL注入不要再用addslashes和mysql_real_escape_string了,有需要的朋友可以参考下. 博主热衷各种互联网技术,常啰嗦,时常伴有强迫症,常更新,觉得文章对你有帮助 ...

  5. PHP mysql_real_escape_string() 函数防SQL注入

    PHP MySQL 函数 定义和用法 mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符. 下列字符受影响: \x00 \n \r \ ' &quo ...

  6. case class 和class的区别以及构造器参数辨析

    工作中偶然发现Scala构造方法中的参数,无论是否有val/var修饰都可以顺利编译运行,如下: class AA(name: String) class BB(val name: String) 那 ...

  7. php 内容插入数据库需要mysql_escape_string处理一下 展示内容时候用htmlentities

    php 内容插入数据库需要mysql_escape_string处理一下 mysql_escape_string (PHP 4 >= 4.0.3, PHP 5, 注意:在PHP5.3中已经弃用这 ...

  8. mysql_escape_string — 转义一个字符串用于 mysql_query

    string mysql_escape_string ( string $unescaped_string ) 本函数将 unescaped_string 转义,使之可以安全用于 mysql_quer ...

  9. PHP : CodeIgniter mysql_real_escape_string 警告

    版本 CodeIgniter 3 PHP 5.4 感谢万能的stackoverflow. 得修改CodeIgniter的源码. ./system/database/drivers/mysql/mysq ...

随机推荐

  1. c语言分析函数调用关系图(call graph)的几种方法

    一.基于 Doxygen或 lxr 的API形式的文档系统. 二.基于CodeViz, CodeViz是<Understanding The Linux Virtual Memory Manag ...

  2. Innodb中的事务隔离级别和锁的关系(转)

    原文:http://tech.meituan.com/innodb-lock.html 前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库 ...

  3. HDU 1847 Good Luck in CET-4 Everybody!(找规律,或者简单SG函数)

    Good Luck in CET-4 Everybody! Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  4. G450 CPU 升级

    T系列是正常功耗的CPU,功耗35W,发热量大些, P系列是低功耗的U,功耗25W,发热量小些. P8700的性能比T6600高15%左右,不过平常应用感觉不是很明显. p8800cpu P8600 ...

  5. 关于设置MX记录

    简介:正确设置MX(Mail Exchanger)邮件交换记录是企业电子邮件服务稳定运行的基本条件,我们经常发现很多企业电子邮箱管理员因为设置了不符合规范的MX记录,导致重要的外部邮件退回或者丢失. ...

  6. 如何防止ASP.NET网站遭受CSRF的攻击

    转载地址: http://www.cnblogs.com/shanyou/p/5038794.html?hmsr=toutiao.io&utm_medium=toutiao.io&ut ...

  7. Codeforces 479E. Riding in a Lift (dp + 前缀和优化)

    题目链接:http://codeforces.com/contest/479/problem/E 题意:         给定一个启示的楼层a,有一个不能去的楼层b,对于你可以去的下一个楼层必须满足你 ...

  8. My集合框架第五弹 最小堆

    二叉堆(以最小堆为例),其具有结构性质和堆序性质结构性质: 堆是一棵完全的二叉树,一颗高为h的完全二叉树有2^h到2^h-1个节点,高度为log N            而且该结构可以很容易的使用数 ...

  9. android 简易定时器

    定时器 1.在android 应用开发当中,很多时候都要用到定时器,而要实现定时器更多的时候要用到两个类:Timer,和TimerTask 2.API对Timer的解释是:

  10. Hibernate操作和保存方式

    Session API [Java Hibernate 之 CRUD 操作]http://www.codeceo.com/article/java-hibernate-crud.html   [Ses ...