`

【转】php 安全 讨论magic_quotes_gpc、mysql_real_escape_string、addslashes的区别及用法

    博客分类:
  • php
 
阅读更多
原文地址:
http://blog.unvs.cn/archives/magic_quotes_gpc-mysql_real_escape_string-addslashes.html

本篇文章,主要先重点说明 magic_quotes_gpc、mysql_real_escape_string、addslashes 三个函数方法的含义、用法,并举例说明。然后阐述下三者间的区别、关系。
一、magic_quotes_gpc含义介绍
这个函数,只有在页面传递 $_GET,$_POST,$_COOKIE 时才会发生作用,主动进行调用,在web客户端执行。对传递的字符串是否进行转义处理。
用法: magic_quotes_gpc=on/off; (当为on时,主动对字符串进行转义处理,即添加转义斜线=单引号转换为\’,若为off,则不进行转义处理)一般默认为off。
举例:
if(!magic_quotes_gpc()){
        $name = addslashes($_POST['name']);
}else{
        $name =  $_POST['name'];
}//这个是对 magic_quotes_gpc 定义的判断,若为off,就要通过  magic_quotes_gpc 进行转义处理,否则不做处理。

二、mysql_real_escape_string含义介绍
这个函数,作用和 magic_quotes_gpc 差不多,同样是对字符串进行转义处理,是在入数据库前的处理,特别是对于多字符节处理时,安全性高于下面要说的addslashes。可有效防止对数据库的攻击。
用法: mysql_real_escape_string(string,connection) ,string为转义字符串,connection为数据库连接字符串--可选。
举例:
<?php
function check_input($value)
{
// 若设置为on,则需要反转义
if (get_magic_quotes_gpc())
  {
  $value = stripslashes($value);
  }
// 判断是否为纯数字
if (!is_numeric($value))
  {
  $value = "'" . mysql_real_escape_string($value) . "'";
  }
return $value;
}

$con = mysql_connect("localhost", "unvs", "123456");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

// 检查字符串,存入数据库
$user = check_input($_POST['user']);
$pwd = check_input($_POST['pwd']);
$sql = "SELECT * FROM users WHERE
user=$user AND password=$pwd";

mysql_query($sql);
mysql_close($con);
?>

三、addslashes含义介绍
在第一个举例中,我们用到了 addslashes 函数,作用同样为对GET、POST、COOKIE过来的字符串进行转义处理,通常与 magic_quotes_gpc 结合使用,。
用法:此函数是对字符串进行强行转义,另同magic_quotes_gpc。
举例:见第一点。

下面讲述下三者之间的区别、关系:
1、addslashes  与 mysql_real_escape_string,同样的作用是经过转义后,可直接插入数据库, 国内很多PHP coder是使用addslashes函数防止SQL注入,但是其实,最好的还是建议大家使用后者来转义数据。
举例说明:addslashes的问题在于黑客可以用0xbf27来代替单引号,而addslashes只是将0xbf27修改为0xbf5c27,成为一个有效的多字节字符,其中的0xbf5c仍会被看作是单引号,所以addslashes无法成功拦截。
两者何时用:addslashes也不是毫无用处,它是用于单字节字符串的处理,多字节字符还是用mysql_real_escape_string更加安全。

2、magic_quotes_gpc的说明,在首次客户端运行时,可用第一条的举例,对 magic_quotes_gpc 进行 $_['name'] 判断,可转义处理。

3、 mysql_real_escape_string和mysql_escape_string这2个函数的区别:
mysql_real_escape_string 必须在(PHP 5以上、PHP 4 >= 4.3.0)版本的情况下才能使用。否则只能用 mysql_escape_string 。
两者的区别是:mysql_real_escape_string 考虑到连接的当前字符集,而mysql_escape_string 不考虑。

4、实际开发中,正确的逻辑处理,如下:
首先,检查 magic_quotes_gpc 是否配置为自动转义斜线,若为on,应该调用stripslashes去掉$_REQUEST、$_GET,$_POST、$_COOKIE的转义斜线;
然后,查询/写入/更新数据至mysql时,再使用mysql_real_escape_string进行字符转义。

好了,就总结这么多,相信大家对于这三个函数都有了一定的了解,并在实际开发中,知道对于程序安全的逻辑处理。以后还有补充再添上。

部分内容参考、搜集整理于以下文章:
addslashes和mysql_real_escape_string: http://www.phpq.net/tutorial/addslashes-mysql_real_escape_string.html
PHP中magic_quotes_gpc的正确处理方式: http://blog.csdn.net/lyjtynet/article/details/6261169

另附一篇有关 magic_quotes_gpc详细使用方法 的文章: http://developer.51cto.com/art/200911/165392.htm

本博文章基本上属于原创或收集整理,都是心血结晶。
欢迎转载分享,转载请注明出处,谢谢!
本文地址:http://blog.unvs.cn/archives/magic_quotes_gpc-mysql_real_escape_string-addslashes.html
分享到:
评论

相关推荐

    php中get_magic_quotes_gpc()函数说明

    然后,如果不是数字类型的数据,使用`mysql_real_escape_string()`进行SQL转义。需要注意的是,这段代码使用了已废弃的`mysql_`系列函数,实际应用中应使用`mysqli_`或`PDO`。 总结一下关于`magic_quotes_gpc`和`...

    php addslashes和mysql_real_escape_string

    为了增强安全性,推荐使用`mysql_real_escape_string()`,并始终检查`get_magic_quotes_gpc()`的设置,以确保对用户输入进行充分的转义。同时,随着技术的发展,应考虑使用预处理语句(如PDO或mysqli的预处理功能)...

    php常用的安全过滤函数集锦

    在讨论mysql_real_escape_string()和addslashes()之前,了解get_magic_quotes_gpc()和get_magic_quotes_runtime()两个函数同样重要。这两个函数用于检查PHP配置文件php.ini中是否开启了magic_quotes_gpc和magic_...

    PHP中字符平安过滤函数用法小结_.docx

    其次,`addslashes()`函数与`mysql_real_escape_string()`类似,也是为特殊字符添加反斜杠。但当`magic_quotes_gpc`配置项开启时,所有GET、POST和COOKIE数据会被自动转义,此时再使用`addslashes()`会导致双重转义...

    php stripslashes和addslashes的区别

    总的来说,了解 `addslashes()` 和 `stripslashes()` 的使用场景和配合 `magic_quotes_gpc` 的工作方式,以及它们与SQL注入防护的关系,是编写安全的PHP代码所必需的。在实际开发中,应始终关注数据的安全处理,以...

    关于Mysql查询带单引号及插入带单引号字符串问题

    即使`get_magic_quotes_gpc`设置为开启,也应该使用`mysql_real_escape_string`或预处理语句来处理用户输入,以提供额外的安全层。 总结来说,`addslashes`适用于简单场景且只处理单字节字符集,`mysql_real_escape...

    ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法

    return mysql_real_escape_string($str, $this-&gt;_linkID); } else { return mysql_escape_string($str); } } ``` 通过这种方法,无论数据之前是否被转义,都可以确保在入库前正确转义,同时避免了二次转义的...

    PHP中常用的转义函数

    包括(‘), (“), (), (NUL)四个字符,此函数在DBMS没有自己的转义函数时候使用,但是如果DBMS有自己的转义函数,那么推荐使用原装函数,比如MySQL有mysql_real_escape_string函数用来转义SQL。 注意在PHP5.3之前,...

    php 防止单引号,双引号在接受页面转义

    在处理用户输入时,推荐使用PHP内置的函数如mysql_real_escape_string()(针对MySQL)或PDO和mysqli预处理语句来处理数据库查询中的特殊字符。对于HTML输出,可以使用htmlentities()或htmlspecialchars()函数进行...

    php 反斜杠处理函数addslashes()和stripslashes()实例详解

    在上述代码中,首先检查魔术引号是否开启,然后使用`mysqli_real_escape_string()`对用户输入进行安全处理,这通常是连接到MySQL数据库时防止SQL注入的最佳做法。 总之,`addslashes()`和`stripslashes()`是PHP中...

    浅谈htmlentities 、htmlspecialchars、addslashes的使用方法

    例如,如果你正在存储用户输入的数据到数据库,可能需要先使用`addslashes`,然后在插入之前使用`mysql_real_escape_string`。而在输出数据到HTML页面时,`htmlspecialchars`是首选,以防止XSS攻击。理解并正确使用...

    asp和php下textarea提交大量数据发生丢失的解决方法

    - 若`get_magic_quotes_gpc`为`0`,则需要手动使用`addslashes`对POST数据进行转义,之后再使用`mysql_real_escape_string`进行二次转义,最后插入数据库。 2. **处理特殊字符**:对于无法正常录入的特殊字符,...

    PHP中字符安全过滤函数使用小结

    例如,对于来自表单的数据,可以使用`htmlspecialchars()`来防止XSS攻击,而对于数据库查询语句,应使用预处理语句或者`mysql_real_escape_string()`函数进行安全处理。同时,开发者应避免直接在数据库查询中使用...

    web渗透测试技巧(下)

    - **转义特殊字符**:通过使用`addslashes()`、`mysql_escape_string()`或`mysql_real_escape_string()`等函数来转义用户输入中的特殊字符。 - **参数化查询**:使用预编译语句来避免SQL注入的风险,这是一种更为...

Global site tag (gtag.js) - Google Analytics