台灣最大程式設計社群網站
線上人數
1594
 
會員總數:243176
討論主題:187991
歡迎您免費加入會員
討論區列表 >> PHP >> get POST值問題
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
get POST值問題
價值 : 50 QP  點閱數:496 回應數:19

樓主

xyz70941
門外漢
0 1
57 8
發送站內信

最近寫code,遇到一個奇怪的問題,
架了一個網站,post參數進來,
$query = $_POST["query_string"];
echo $query;
當參數是select * from user;
是可以印出來的,
當參數是select * from user where 1 = 1;
這時候就沒辦法印出來,
環境是LAMP,有沒有高手也遇過這種問題。

搜尋相關Tags的文章: [ post ] ,
本篇文章發表於2018-03-06 14:29
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
作者回應

xyz70941
檢舉此回應
補充說明,
當參數是select * from user;
狀態碼是200,
當參數是select * from user where 1 = 1;
狀態碼是406
本篇文章回覆於2018-03-06 14:31
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

小羊窒息
捐贈 VP 給 小羊窒息 檢舉此回應
寫死 $query = "select * from user where 1 = 1;";

也是 http 406 嗎?
本篇文章回覆於2018-03-06 14:52
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

xyz70941
檢舉此回應
寫死不是,目前是死在取得$_POST["query_string"]
本篇文章回覆於2018-03-06 15:44
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

迷路
捐贈 VP 給 迷路 檢舉此回應
在PHP開頭加入
ini_set('display_errors','1');
error_reporting(E_ALL);
看看錯誤訊息是什麼

另外,把SQL式用POST/GET來傳遞真的不是個好方法
對駭客來說,這根本是讓人可以輕鬆取得/刪掉整個資料庫的設計
本篇文章回覆於2018-03-07 09:25
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

淺水員
檢舉此回應
有可能是是那個「=」的問題
接收到的字串先不要送資料庫
直接印出來看看收到的字串是不是「select * from user where 1 = 1;」
本篇文章回覆於2018-03-07 14:01
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

xyz70941
檢舉此回應
在PHP開頭加入
ini_set('display_errors','1');
error_reporting(E_ALL);
看看錯誤訊息是什麼

加入了一樣是回傳了406

有可能是是那個「=」的問題
接收到的字串先不要送資料庫
直接印出來看看收到的字串是不是「select * from user where 1 = 1;」

是直接印出來啊,沒有送到資料庫,
接收值就掛了
本篇文章回覆於2018-03-07 21:48
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

淺水員
檢舉此回應
要送字串資料給PHP,遇到特殊字元要轉碼,可以利用 encodeURIcompont
例如在 javascript 中:
xhr.send("query_string="+encodeURIcompont("select * from user where 1 = 1;"));

(上面的例子是用 XMLHttpRequest 傳送資料)
本篇文章回覆於2018-03-08 01:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

迷路
捐贈 VP 給 迷路 檢舉此回應
在開頭加入
header("Content-type: text/html; charset=utf-8");
然後echo改成
echo htmlspecialchars($query);
試試看
本篇文章回覆於2018-03-08 09:32
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
正常來說,一般是最好不要直接用get或是post給與sql的條件式參數。

這邊要注意的是一些特殊碼的問題。
正常來說,如果是直接表單傳送的。大多數如果用post的話。比較不會有這樣的問題。

但安全起見,一般如果有一些特殊碼的情況下。還是會做一些轉碼的動作。
去避免一些因為剛好符合運算式而發生的錯誤。

但如果可以的話,還是盡量不要設計成需要傳 =<>!&? 這些字元的情況
本篇文章回覆於2018-03-08 11:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
作者回應

xyz70941
檢舉此回應
要送字串資料給PHP,遇到特殊字元要轉碼,可以利用 encodeURIcompont
例如在 javascript 中:
xhr.send("query_string="+encodeURIcompont("select * from user where 1 = 1;"));

(上面的例子是用 XMLHttpRequest 傳送資料)

我是用postman去post的,Content-Type:application/x-www-form-urlencoded



在開頭加入
header("Content-type: text/html; charset=utf-8");
然後echo改成
echo htmlspecialchars($query);
試試看


一樣不行,406

正常來說,一般是最好不要直接用get或是post給與sql的條件式參數。

這邊要注意的是一些特殊碼的問題。
正常來說,如果是直接表單傳送的。大多數如果用post的話。比較不會有這樣的問題。

但安全起見,一般如果有一些特殊碼的情況下。還是會做一些轉碼的動作。
去避免一些因為剛好符合運算式而發生的錯誤。

但如果可以的話,還是盡量不要設計成需要傳 =<>!&? 這些字元的情況

哈哈哈,幫忙維護而已,我看到也傻眼,但要調整有很多檔案要改,


我覺得應該是server的問題,
我單純
echo "select * from user where 1 = 1;";
exit;
沒有接受參數,但是傳送select * from user where 1 = 1;進去
一樣被導到406,
可能要找找看有沒有關於apache的設定的


本篇文章回覆於2018-03-08 13:27
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
其實我怕的是主機或web server它的防注入防護。(現在一些新的web server或是比較高的版本會這樣)
現在有很多框架或是web server。會自動針對post跟get這些參數做防護。如參數中有送=就不行

至少我就有過一個客戶的案例。(轉碼沒用,因為server還是會判定這是違法的定義方式)
比較新的web server會這樣。

這時候就只能從web server中的一些安全性設定中將其可容許通過就行了
本篇文章回覆於2018-03-08 18:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
作者回應

xyz70941
檢舉此回應
我也覺得是這樣,重點是我還找不到免費空間的安全設定,
我使用的是ix web hosting,有人知道哪裡可以設定嗎?
而且前一星期功能都還是正常的,是突然不行了…
本篇文章回覆於2018-03-08 22:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
回應

淺水員
檢舉此回應
我不知道伺服器這樣過濾用途有多大
如果想要繞過的話我會用base64傳資料
萬一他連base64也檢查
那還可以在base64前面加1個字元
實際取值從第2個字元開始取
本篇文章回覆於2018-03-08 22:51
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
回應

淺水員
檢舉此回應
我覺得應該是server的問題,
我單純
echo "select * from user where 1 = 1;";
exit;
沒有接受參數,但是傳送select * from user where 1 = 1;進去
一樣被導到406,
可能要找找看有沒有關於apache的設定的

「傳送select * from user where 1 = 1;進去」是指傳資料庫嗎?
如果是話,這邊的問題就不是POST資料的問題了
萬一無法設定,就只好乖乖改程式架構了
本篇文章回覆於2018-03-08 22:55
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
15樓
作者回應

xyz70941
檢舉此回應
「傳送select * from user where 1 = 1;進去」是指傳資料庫嗎?
如果是話,這邊的問題就不是POST資料的問題了
萬一無法設定,就只好乖乖改程式架構了

傳送是指我還是post到那個function,但是我單純輸出字串,
但結果還是406的狀態,就是進去function之前就被導掉了
本篇文章回覆於2018-03-09 08:59
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   

回覆
如要回應,請先登入.