magic_quotes_gpc是用來判斷我們apache是不是開啟了自動轉譯功能了,為了讓各位更好的理解魔法引用magic_quotes_gpc()函數用法下面來給各位總結與舉一些例子.
magic_quotes_gpc的設定值將會影響通過Get/Post/Cookies獲得的數據.
這兩天接入百度SDK處理支付回調時碰到了簽名通不過的情況,簽名規則很簡單,md5(transdata + appkey) 和 接受到的sign比較,請求方式為POST.
于是乎通過php://input記錄下了原始數據和記錄下了POST數據,通過日志查看到結果類似如下:
- //原始數據
- transdata={"exorderno":"2014031223","transid":"05514312314566",
- "waresid":1,"appid":"1","feetype":0,"money":1,"count":1,"result":0,
- "transtype":0,"transtime":"2014-03-12 15:33:19","paytype":401}&sign=xxxx
- //開源軟件:Vevb.com
- //post數據
- [transdata] => {/"exorderno/":/"2014031223452345234/",/"transid/":
- /"05514031215312314566/",/"waresid/":1,/"appid/":/"1/",/"feetype/":0,
- /"money/":1,/"count/":1,/"result/":0,/"transtype/":0,
- /"transtime/":/"2014-03-12 15:33:19/",/"paytype/":401}
- [sign] => xxxx
可見接收到post數據時引號自動轉義了,而程序上未做到該操作,很容易就聯想到服務器的魔法引用打開了,查看.
php版本
PHP 5.2.14 (cli) (built: Jun 7 2012 20:39:40)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies
例子說明:
- $data1 = $_POST['aaa'];
- $data2 = implode(file('1.txt'));
- if(get_magic_quotes_gpc()){
- //把數據$data1直接寫入<a href="/database/database.html" target="_blank">數據庫</a> (自動轉譯)
- }else{
- $data1 = addslashes($data1);
- //把數據$data1寫入數據庫,用函數(addslashes()轉譯)
- }
- if(get_magic_quotes_runtime()){
- //把數據$data2直接寫入數據庫(自動轉譯)
- //從數據庫讀出的數據要經過一次stri<a href="/fw/photo.html" target="_blank">ps</a>lashes()之后輸出,stripslashes()的作用是去掉:/ ,和addslashes()作用相反
- }else{
- $data2 = addslashes($data2);
- //把數據$data2寫入數據庫
- //從數據庫讀出的數據直接輸出
- }
最關鍵的區別是就是上面提到的2點:他們針對的處理對象不同,magic_quotes_gpc的設定值將會影響通過Get/Post/Cookies獲得的數據,注意的是沒有 set_magic_quotes_gpc()這個函數,就是不能在程序里面設置magic_quotes_gpc的值.
魔法引用5.4才刪掉的,那極有可能這里打開在,查看配置文件確實如此,根據條件開關strip一下即可.
問題很快就解決了,但如果不熟悉這塊可能還需要點時間,之前在CI的全局參數xss設置中有類似的地方,當進行全局處理之后對于這種接口、密鑰可能會帶來一些影響,所以全局參數過濾需要注意點.
矛盾可分為主要矛盾和次要矛盾,我們在程序設計中也常有這種思想,改最少的地方,過濾大部分參數,少數特殊處理,php中把它去掉了并不說明它沒有存在的價值,有了魔法引用少了很多注入,但同時也讓一些東西變得混亂,哪里需要轉義,要怎么轉義,通過什么方式來轉義等等,客觀看待,汲取中間有用的部分.
新聞熱點
疑難解答