www.2527.com_澳门新葡8455手机版_新京葡娱乐场网址_
做最好的网站

daddslashes有啥样差异剖析_php技能_脚本之家,mag

2019-11-23 19:58 来源:未知

//GPC过滤,自动转义$_GET,$_POST,$_COOKIE中的特殊字符,防止SQL注入攻击 $_GET = saddslashes; $_POST = saddslashes; 复制代码 代码如下: 下面是daddslashes的例子eg: saddslashes function daddslashes($string, $force = 0, $strip = FALSE) { //字符串或数组 是否强制 是否去除 //如果魔术引用未开启 或 $force不为0 if(!MAGIC_QUOTES_GPC || $force) { if { //如果其为一个数组则循环执行此函数 foreach($string as $key => $val) { $string[$key] = daddslashes; } } else { //如果魔术引用开启或$force为0 //下面是一个三元操作符,如果$strip为true则执行stripslashes去掉反斜线字符,再执行addslashes //$strip为true的,也就是先去掉反斜线字符再进行转义的为$_GET,$_POST,$_COOKIE和$_REQUEST $_REQUEST数组包含了前三个数组的值 //这里为什么要将$string先去掉反斜线再进行转义呢,因为有的时候$string有可能有两个反斜线,stripslashes是将多余的反斜线过滤掉 $string = addslashes($strip ? stripslashes; } } return $string; }eg: saddslashes function saddslashes { if{ if { //如果转义的是数组则对数组中的value进行递归转义 foreach($string as $key => $val) { $string[$key] = saddslashes; } } else { $string = addslashes、双引号与 NUL,进行转义 } return $string; }else{ return $string; } 主要就是: saddslashes可以实现对每一个数据进行转义处理了 复制代码 代码如下: function saddslashes { if { foreach($string as $key => $val) { $string[$key] = saddslashes; } } else { $string = addslashes; } return $string; }

如果你网站空间的php.ini文件里的magic_quotes_gpc设成了off,那么PHP就不会在敏感字符前加上反斜杠(\),由于表单提交的内容可能含有敏感字符,如单引号('),就导致了SQL injection的漏洞。在这种情况下,我们可以用addslashes()来解决问题,它会自动在敏感字符前添加反斜杠。

有时候为了安全起见,我们需要对用户输入的字符串进行转义文章中有不正确的或者说辞不清的地方,麻烦大家指出了~~~

如何禁用 magic_quotes_gpc 和safe_mode
1,用 php.ini 配置文件全局禁用

与PHP字符串转义相关的配置和函数如下:
1.magic_quotes_runtime
2.magic_quotes_gpc
3.addslashes()和stripslashes()
4.mysql_escape_string()
5.addcslashes()和stripcslashes()
6.htmlentities() 和html_entity_decode()
7.htmlspecialchars()和htmlspecialchars_decode()

magic_quotes_gpc = Off
safe_mode = Off

当magic_quotes_runtime打开时,php的大部分函数自动的给从外部引入的(包括数据库或者文件)数据中的溢出字符加上反斜线。
可以使用set_magic_quotes_runtime()与get_magic_quotes_runtime()‍设置和检测其状态。
注意:PHP5.3.0以上的版本已将这两个函数废弃,也就说在PHP5.3.0或以上版本时该选项已经为关闭了。

magic_quotes_gpc设置是否自动为GPC(GET,POST,COOKIE)传来的数据中的某些字符进行转义,
可以使用get_magic_quotes_gpc()检测其设置。
如果没有打开这项设置,可以使用addslashes()函数添加给字符串进行转义

2,使用 .htaccess 文件禁用(对于虚拟主机)

addslashes()‍ 在指定的预定义字符前添加反斜杠。
预定义字符包括单引号、反斜线与 NUL。
以上是W3SCHOOL.COM.CN给出的解释俺一直觉的不是很准确
因为在magic_quotes_sybase=on时它将单引号转换成双引号 在magic_quotes_sybase=off时才将单引号
stripslashes()函数的功能与addslashes()‍正好相反,它的功能是去除转义的效果。

php_flag magic_quotes_gpc Off
php_flag safe_mode Off

mysql_escape_string() 转义 SQL语句中使用的字符串中的特殊字符。‍
这里的特殊包括、、、、

禁用了这两个东东后,安全问题就更加不能忽视了。在数据入库前一定要addslashes ,出库后要记得stripslashes 。

addcslashes()‍以C 语言风格使用反斜线转义字符串中的字符,这个函数很少人去用,但是应该注意的是:当选择对字符 0,a,b,f,n,r,t 和 v 进行转义时,它们将被转换成 \0,a,b,f,n,r,t 和 v。在 PHP 中,只有 \0,r,n和 t是预定义的转义序列, 而在 C 语言中,上述的所有转换后的字符都是预定义的转义序列。同理stripcslashes()的功能就是去除其转义。

但是,上面的方法只适用于magic_quotes_gpc=Off的情况。作为一个开发者,你不知道每个用户的magic_quotes_gpc是On
还是Off,如果把全部的数据都用上addslashes(),那不是“滥杀无辜”了?假如magic_quotes_gpc=On,并且又用了addslashes()函数,那让我们来看看:

htmlentities() 把字符转换为 HTML 实体。(什么是HTML实体?自己GOOGLE吧~~)
具体参数请见这里,其逆反的函数html_entity_decode() -‍把 HTML 实体转换为字符。

php

htmlspecialchars()函数把一些预定义的字符转换为 HTML 实体。
这些预定义的字符是:
& 成为 &
" 成为 "
' 成为 '
< 成为 <
> 成为 >
‍详细参数请见这里,其逆反函数是htmlspecialchars_decode() 把一些预定义的 HTML 实体转换为字符。

//如果从表单提交一个变量$_POST['message'],内容为 Tom's book
//这此加入连接MySQL数据库的代码,自己写吧
//在$_POST['message']的敏感字符前加上反斜杠
$_POST['message'] = addslashes($_POST['message']);

一点自己的体会:
>>多次的单引号转义可能引起数据库的安全问题
>> 不建议使用mysql_escape_string 来进行转义,建议在获取用户输入时候进行转义
>> 由于set_magic_quotes_runtime()‍在PHP5.3.0和以后版本已被废弃了, 所以之前的版本建议统一配置关闭:

//由于magic_quotes_gpc=On,所以又一次在敏感字符前加反斜杠
$sql = "Insert INTO msg_table VALUE('$_POST[message]');";

复制代码代码如下:
if(phpversion() < '5.3.0') {
set_magic_quotes_runtime;
}
‍>> 无法通过函数来定义magic_quotes_gpc,因此建议在服务器上统一开启,写程序的时候应该在来判断下,避免没开启GPC引起安全问题
通过addslashes对GPC进行时候转义时,应注意当用户提交数组数据时对键值和值的过滤

//发送请求,把内容保存到数据库内
$query = mysql_query($sql);

复制代码代码如下:
if(!get_magic_quotes_gpc {
$_GET = daddslashes;
$_POST = daddslashes;
$_COOKIE = daddslashes;
$_FILES = daddslashes;
}
function daddslashes($string, $force = 1) {
if(is_array {
foreach($string as $key => $val) {
unset($string[$key]);
$string[addslashes] = daddslashes($val, $force);
}
} else {
$string = addslashes;
}
return $string;
}
‍>> 利用在用户输入或输出时候转义HTML实体以防止XSS漏洞的产生!

//如果你再从数据库内提取这个记录并输出,就会看到 Tom\'s book
?>

今天碰到一个处理文件特殊字符的事情,再次注意到这个问题,在php中:

这样的话,在magic_quotes_gpc=On的环境里,所有输入的单引号(')都会变成(\')……
其实我们可以用get_magic_quotes_gpc()函数轻易地解决这个问题。当magic_quotes_gpc=On时,该函数返回TRUE;当magic_quotes_gpc=Off时,返回FALSE。至此,肯定已经有不少人意识到:问题已经解决。请看代码:
php

*以单引号为定界符的php字符串,支持两个转义'和\
*以双引号为定界符的php字符串,支持下列转义:
n换行(LF或ASCII字符0x0A
r回车(CR或ASCII字符0x0D
t水平制表符(HT或ASCII字符0x09
\反斜线
$美元符号
"双引号
[0-7]{1,3}此正则表达式序列匹配一个用八进制符号表示的字符
x[0-9A-Fa-f]{1,2}此正则表达式序列匹配一个用十六进制符号表示的字符

//如果magic_quotes_gpc=Off,那就为提单提交的$_POST['message']里的敏感字符加反斜杠
//magic_quotes_gpc=On的情况下,则不加
if (!get_magic_quotes_gpc()) {
$_POST['message'] = addslashes($_POST['message']);
} else {}
?>

举几个例子:

其实说到这里,问题已经解决。下面再说一个小技巧。
有时表单提交的变量不止一个,可能有十几个,几十个。那么一次一次地复制/粘帖addslashes(),是否麻烦了一点?由于从表单或URL获取的数据都是以数组形式出现的,如$_POST、$_GET)那就自定义一个可以“横扫千军”的函数:

一个包含\0特殊字符的例子:

php

$str="ffff\0ffff";
echo(strlen;
echo;
for($i=0;$i<strlen;$i )echo("t".ord);
echo;

function quotes($content)
{
//如果magic_quotes_gpc=Off,那么就开始处理
if (!get_magic_quotes_gpc()) {
//判断$content是否为数组
if (is_array($content)) {
//如果$content是数组,那么就处理它的每一个单无
foreach ($content as $key=>$value) {
$content[$key] = addslashes($value);
}
} else {
//如果$content不是数组,那么就仅处理一次
addslashes($content);
}
} else {
//如果magic_quotes_gpc=On,那么就不处理
}
//返回$content
return $content;
}
?>

输出结果:

9
1021021021020102102102102

替换特殊字符的例子

$str="ffff\0ffff";
$str=str_replace("x0","",$str);
//或者用$str=str_replace("\0","",$str);
//或者用$str=str_replace,"",$str);
echo(strlen;
echo;
for($i=0;$i<strlen;$i )echo("t".ord);
echo;

看了下phpwind和 discuz的源码 ,发现phpwind就是直接用的addslashes和stripslashes 。而dz则是自己定义了两个函数:

输出结果:

8
102102102102102102102102

八进制ascii码例子:

//注意,符合正则[0-7]{1,3}的字符串,表示一个八进制的ascii码。
$str="\0\01www.2527.com,023710\011\088";//这里的8不符合要求,被修正为"\8"(ascii为92和56)
echo(strlen;
echo;
for($i=0;$i<strlen;$i )echo("t".ord);
echo;

function daddslashes($string, $force = 0)
    {
    !defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());
    if(!MAGIC_QUOTES_GPC || $force)
    {
        if(is_array($string))
        {
            foreach($string as $key => $val)
            {
                $string[$key] = daddslashes($val, $force);
            }
        } else
        {
            $string = addslashes($string);
        }
    }
    return $string;
    }
   
        function dstripslashes($string)
        {
        if(is_array($string))
        {
            foreach($string as $key => $val)
            {
                $string[$key] = dstripslashes($val);
            }
        }
        else
        {
            $string = stripslashes($string);
        }
        return $string;
        }
dz的这两个函数的在原函数的基础上扩充了对数组数据的支持,用起来更方便。不过dz的这两个函数不够简洁,这里我给出两个简洁点的:

输出结果:

11
01237890569256

十六进制ascii码例子:

$str="x0x1x2x3x7x8x9x10x11xff";
echo(strlen;
echo;
for($i=0;$i<strlen;$i )echo("t".ord);
echo;
输出结果:

function addslashes_deep($string)
  {
    $string = is_array($string)?array_map('addslashes_deep', $string):addslashes($string);
    return $string; 
  }
 
 
    function stripslashes_deep($string)
  {
    $string = is_array($string)?array_map('stripslashes_deep', $string):stripslashes($string);
    return $string; 
  }

在数据入库前和出库后都要记得:

//入库前
if(!get_magic_quotes_gpc())
{
$_GET=addslashes_deep($_GET);
$_POST=addslashes_deep($_POST);
$_REQUEST=addslashes_deep($_REQUEST);
//其它要处理的变量.......
}

//出库后
if(get_magic_quotes_gpc())
{
$_GET=stripslashes_deep($_GET);
$_POST=stripslashes_deep($_POST);
$_REQUEST=stripslashes_deep($_REQUEST);
//其它要处理的变量.......
}

TAG标签:
版权声明:本文由澳门新葡8455手机版发布于www.2527.com,转载请注明出处:daddslashes有啥样差异剖析_php技能_脚本之家,mag