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 //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直接寫入資料庫 (自動轉譯) }else{ $data1 = addslashes($data1); //把資料$data1寫入資料庫,用函數(addslashes()轉譯) } if(get_magic_quotes_runtime()){ //把資料$data2直接寫入資料庫(自動轉譯) //從資料庫讀出的資料要經過一次stripslashes()之後輸出,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中把它去掉了並不說明它沒有存在的價值,有了魔法引用少了很多注入,但同時也讓一些東西變得混亂,哪裡需要轉義,要怎麼轉義,通過什麼方式來轉義等等。客觀看待,汲取中間有用的部分