![]() ![]() ![]() ![]() |
|||||
|
|||||
樓主 xyz70941 ![]()
![]() |
架了一個網站,post參數進來, $query = $_POST["query_string"]; echo $query; 當參數是select * from user; 是可以印出來的, 當參數是select * from user where 1 = 1; 這時候就沒辦法印出來, 環境是LAMP,有沒有高手也遇過這種問題。
搜尋相關Tags的文章:
[ post ] ,
本篇文章發表於2018-03-06 14:29 |
1樓
作者回應
xyz70941 ![]() |
補充說明,
當參數是select * from user; 狀態碼是200, 當參數是select * from user where 1 = 1; 狀態碼是406
本篇文章回覆於2018-03-06 14:31
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
2樓 |
寫死 $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樓 |
在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樓 |
在開頭加入
header("Content-type: text/html; charset=utf-8"); 然後echo改成 echo htmlspecialchars($query); 試試看
本篇文章回覆於2018-03-08 09:32
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
9樓 |
正常來說,一般是最好不要直接用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樓 |
其實我怕的是主機或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
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
回覆 |
如要回應,請先登入. |