PHP魔术引号所带来的安全问题分析

5年以前  |  阅读数:319 次  |  编程语言:PHP 

PHP通过提取魔术引号产生的"\"字符会带来一定的安全问题,例如下面这段代码片段:


    // foo.php?xigr='ryat
    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;
    }
    ...
    foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
    foreach($$_request as $_key => $_value) {
    $_key{0} != '_' && $$_key = daddslashes($_value);
    }
    }
    echo $xigr['hi'];
    // echo \

上面的代码原本期望得到一个经过daddslashes()安全处理后的数组变量$xigr['hi'],但是没有对变量$xigr做严格的类型规定,当我们提交一个字符串变量$xigr='ryat,经过上面的处理变为\'ryat,到最后$xigr['hi']就会输出\,如果这个变量引入到SQL语句,那么就会引起严重的安全问题了,对此再来看下面的代码片段:


    ...
    if($xigr) {
    foreach($xigr as $k => $v) {
    $uids[] = $v['uid'];
    }
    $query = $db->query("SELECT uid FROM users WHERE uid IN ('".implode("','", $uids)."')");

利用上面提到的思路,通过提交foo.php?xigr[]='&xigr;[][uid]=evilcode这样的构造形式可以很容易的突破GPC或类似的安全处理,形成SQL注射漏洞!对此应给与足够的重视!

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
将二进制数据转为16进制以便显示
获取IMSI
获取IMEI
Java生成UUID
PHP自定义函数获取搜索引擎来源关键字的方法
让你成为最历害的git提交人
在Zeus Web Server中安装PHP语言支持
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
php+ajax+json 详解及实例代码
Python 2与Python 3版本和编码的对比
Yii2汉字转拼音类的实例代码
php封装的page分页类完整实例
php数组合并array_merge()函数使用注意事项
PHP设计模式之工厂模式与单例模式
PHP实现简单爬虫的方法
php实现数组中索引关联数据转换成json对象的方法
wget使用技巧