2011-10-22 28 views
2

我正在使用Codeginiter,並在使用「&」符號時看到在我的字符串末尾添加了分號。見下文。順便說一句,我將這個值存儲到MySQL DB中。當字符串包含「&」符號時值超過分號

在將值插入數據庫之前,我正在使用htmlspecialchars

$this->form_validation->set_rules('item_name','description','trim|required|min_length[3]|xss_clean');  

這工作:

$string = "you & I"; 
// Displays "you & i" 

這在DB追加一個分號:

$string = "you&i"; 
// Displays "you&i;" 
+0

HTML轉成屬於輸出邏輯。 (儘管安全性高於對不起,過早地執行它本身並不是錯誤的,但這不是推薦的方法,儘管這裏的問題只是過度的實現。) – mario

回答

4

您正在使用CI的xss_clean「功能」,該功能剛剛壞掉了。如果您在某處應用xss_clean,請不要期望您的數據能夠存活。

取而代之,禁用它,事情應該沒問題。

然後適當地過濾您的數據。實際使用xss_clean的建議在CodeIgniter文檔中只是誤導。保重。

+0

哇,那樣做了。我刪除了'xss_clean',它工作。我應該使用其他的東西嗎? – luckytaxi

+0

你問的事實是一個明確的信號,你不知道你實際做了什麼。如果您想要安全地編寫應用程序,則必須先了解輸入,輸出和編碼的基礎知識。那麼你能做什麼呢?適當地過濾,即通過知識,而不是猜測。 – hakre

+0

我的意思是如果有另一個內建CI函數。我將使用一些標準的PHP函數進行過濾。 – luckytaxi

1

我想這是因爲&i被解釋爲實體。我建議你將所有的html特殊字符(如&,<,>等)與它們各自的htmlentities進行轉換。在PHP中,您可以使用htmlspecialcharshtmlentities函數來執行此操作。

+0

那麼用「htmlentities」來代替? – luckytaxi

+0

是的,因爲我建議在我的(更新)的答案;) –

+0

更多參考:http://codeigniter.com/forums/viewthread/84137/#429628 –

0

在將數據保存到數據庫之前,POST數據已被污染。

順便說一下,我也使用CI框架。

例如,客戶端側柱使用數據正常形態POST方法
Cow&Gate/英國牛欄
,你會得到在PHP服務器端是什麼?

你會得到
Cow&Gate;/英國牛欄
奇怪的是,一個分號已添加

如果您發佈使用XML(或AJAX或jQuery的)的數據,你可以使用encodeURIComponent方法在JavaScript中之前對數據進行編碼你把它發佈到服務器上,你不需要在PHP服務器端做任何額外的工作。

像這樣: $.post('http-server-API', {"field": encodeURIComponent('Cow&Gate/英國牛欄')})

入住PHP服務器端的$ _​​ POST PARAMS(將未加分號)
enter image description here

相關問題