PHP安全新闻早8点_1117
//2011-11-18 星期五 //知识点讲解:urlencode //返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样。由于历史原因,此编码在将空格编码为加号(+)方面与 RFC1738 编码不同。 //PHP 手册中,urldecode 函数原文引用: The superglobals $_GET and $_REQUEST are already decoded. Using urldecode() on an element in $_GET or $_REQUEST could have unexpected and dangerous results. 原型:string urldecode ( string $str ) urldecode() 例子 //Micropoor.php 部分代码 //安全规范代码示例: <?php $a = explode('&', $QUERY_STRING); $i = 0; while ($i < count($a)) { $b = split('=', $a[$i]); echo 'Value for parameter ', htmlspecialchars(urldecode($b[0])), //希望大家能够规范安全 ' is ', htmlspecialchars(urldecode($b[1])), "\n"; $i++; } ?> //Micropoor.php 部分代码 $str1=urlencode("Micropoor"); //$str1的值是%4D%69%63%72%6F%70%6F%6F%72 $str2=urldecode($str1); //$str2的值就是“Micropoor” //新闻也跑题: URLEncode:是指针对网页url中的中文字符的一种编码转化方式,最常见的就是Baidu、Google等搜索引擎中输入中文查询时候,生成经过 Encode过的网页URL。 URLEncode的方式一般有两种一种是传统的基于GB2312的Encode(Baidu、Yisou等使用),一种是 基于UTF-8的Encode(Google,Yahoo等使用)。本工具分别实现两种方式的Encode与Decode。 中文 -> GB2312的Encode -> %D6%D0%CE%C4 中文 -> UTF-8的Encode -> %E4%B8%AD%E6%96%87 urlencode和rawurlencode的区别: urlencode 将空格则编码为加号(+) rawurlencode 将空格则编码为加号(%20) 如果要使用UTF-8的Encode,有两种方法: 一、将文件存为UTF-8文件,直接使用urlencode、rawurlencode即可。 二、使用mb_convert_encoding函数。 //历史回顾: //Discuz SQL //程序员思维 //..略 foreach($_POST as $k => $v) { $value = urldecode($v); $this->setParameter($k, $value); } 单引号被 urlencode 两次以后是 %2527,然后 POST,PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,然后SQL出现。 //实战源码审核---引用毅心毅意 //程序员思维 function onsearch() { $navtitle = '搜索问题'; $qstatus = $status = $this->get[2]; (3 == $status) && ($qstatus = "1,2"); @$word = urldecode($this->post['word'] ? $this->post['word'] : $this->get[3]);//看这里..如果你get %27 他会过滤.. 如果你get %2527 他会处理成%27.。不会产生注入..但是如果post %27呢 。。成功绕过过滤 empty($word) && $this->message("搜索关键!", 'BACK'); $encodeword = urlencode($word); @$page = max(1, intval($this->get[4])); $pagesize = $this->setting['list_default']; $startindex = ($page - 1) * $pagesize; //每页面显示25条 $rownum = $_ENV['question']->search_title_num($word, $qstatus); //获取总的记录数 $questionlist = $_ENV['question']->search_title($word, $qstatus, $startindex, $pagesize); //问题列表数据 $departstr = page($rownum, $pagesize, $page, "question/search/$status/$word"); //得到分页字符串 $this->load('setting'); $wordslist = unserialize($this->setting['hot_words']); include template('search');; } //我们的思维 利用方式:post 编码的sql注入语句 //知识拓展: //JS实现PHP的urlencode函数 function URLEncode (clearString) { var output = ''; var x = 0; clearString = clearString.toString(); var regex = /(^[a-zA-Z0-9-_.]*)/; while (x < clearString.length) { var match = regex.exec(clearString.substr(x)); if (match != null && match.length > 1 && match[1] != '') { output += match[1]; x += match[1].length; } else { if (clearString.substr(x, 1) == ' ') { //原文在此用 clearString[x] == ' ' 做判断, 但ie不支持把字符串当作数组来访问, //修改后两种浏览器都可兼容 output += '+'; } else { var charCode = clearString.charCodeAt(x); var hexVal = charCode.toString(16); output += '%' + ( hexVal.length < 2 ? '0' : '' ) + hexVal.toUpperCase(); } x++; } } return output; }