2015-02-24 111 views
0

我卡在一個php問題。 我必須發送帶有ajax請求的POST表單的SQL查詢。 這種查詢是這樣的:php替換ascii代碼

SELECT * FROM table WHERE field LIKE '%512%' 

問題是,當我收回這個查詢從PHP POST變種,它表明:

SELECT * FROM table WHERE field LIKE 'Q2%' 

和它顯然失敗...

我嘗試改變爲utf-8,它沒有改變任何東西。

Javascript似乎發送正確的文本,但php讀取POST時更改它。

是否可以防止php讀取%51 ascii代碼?

爲了以防萬一,該網站是用Code Igniter編寫的。

感謝

+0

@Fabien這個問題與UTF-8無關。 – deceze 2015-02-24 08:41:40

回答

1
  1. 不要從JavaScript客戶端發送整個SQL查詢到服務器。不要。這比SQL注入漏洞更糟糕,它僅僅是爲任何人查詢執行任何事情而設計的。
  2. HTTP請求中的數據通常使用percent encoding進行編碼,並猜測:在此編碼中,%51恰好代表「Q」。在通過HTTP請求發送數據時,您需要正確編碼數據,例如使用encodeURIComponent()。如果您想發送「%51」,則需要實際發送%2551。具體情況取決於您如何準確發送該數據。

另請考慮閱讀The Great Escapism (Or: What You Need To Know To Work With Text Within Text)

+0

我知道這不是一個好習慣,但我需要將查詢保存到我的數據庫中。我還有什麼其他的方式呢?我應該加密查詢嗎? – 2015-02-24 09:40:08

+0

如果你實際上不會在任何時候執行查詢,那沒關係。那麼它就像任何其他文本一樣。如果你想要做的是讓你的用戶建立自己的自定義查詢,你應該提供某種查詢構建器。最後,你應該存儲數據,例如'{「conditions」:[{「column」:「foo」,「operation」:「like」,「value」:「%baz%」},..]}'然後基於此生成實際的SQL查詢。這個想法是,查詢的變量部分以一些受控的,有限的語法表達,而不是自由格式的SQL。 – deceze 2015-02-24 12:46:18

0

雖然你可以使用%25512%,但我同意欺騙。

使用%25將被解釋爲%標誌

所以使用%25Your number

+0

%512%是一個例子,它可以是任何數字 – 2015-02-24 09:42:25

+0

好的感謝您的建議 – 2015-02-24 10:08:20

0

POST數據:URL編碼替換不安全的ASCII字符後跟兩個十六進制數字 「%」。
第一:使用javascript函數編碼數據。

var res = encodeURI("SELECT * FROM table WHERE field LIKE '%512%'"); 

然後使用ajax發送數據。

在PHP中,使用功能對數據進行解碼:

$data=urldecode(string $_POST['yourdata']); 

欲瞭解更多信息,你可以通過以下鏈接:

+1

感謝它的工作,但並不需要url中的urldecode。 – 2015-02-24 09:39:08