2017-08-23 146 views
0

我消毒是頁輸出的所有用戶輸入,例如:清理數據PHP - 我需要轉義內部if語句的用戶輸入嗎?

echo escape($user_input); 

我有一個關於不輸出到頁面的,但裏面的語句用戶輸入的問題 - 他們需要逃脫?

這是正確的:

if ($user_input == 'something') { echo escape($another_user_input); } 

或者它應該是:

if (escape($user_input) == 'something') { echo escape($another_user_input); } 

方法,能比這個簡單的例子添加更多faff其他邏輯(foreach循環等)同樣的問題。

+1

插入數據庫之前的第二個值,以便從任何錯誤代碼中清除該值。例如,用戶名!第一個是評論之類的東西,你接受用戶的輸入並打印出來並使用htmlspecialchars! –

+0

@MrPro Wut ?!爲什麼? – deceze

+0

如果只是將它們與預定義的字符串進行比較,則在轉義輸入時幾乎沒有用處。 'echo'行應該被轉義,並且你應該確保沒有任何東西可以破壞頁面中的HTML或插入惡意腳本,所以在這種情況下,我認爲只是'逃避'是不夠的。 –

回答

0

你需要逃避某些事情的唯一原因是當你將數據插入到另一個文本介質中時,它會根據一些規則重新解釋。

例如爲:

echo '<p>' . $somedata . '</p>'; 

這是編程生成HTML將由HTML解析器得到解釋,將取決於裏面有什麼$somedata特定的行爲。

$query = 'SELECT foo FROM bar WHERE baz = ' . $somedata; 

這是編程生成SQL查詢將通過SQL語法分析程序得到解釋,將取決於內部$somedata什麼是特定的行爲。

如果您希望確保HTML或該查詢的行爲符合您的預期,則最好確保以某種方式生成這些文本命令,以避免任何人注入不需要的命令。

if ($somedata == 'something') 

在這裏,你不會創建一些新的文本,將被某些東西解釋。任何人都無法在這裏注入任何東西。這並不像PHP用$somedata的內容替代$somedata,然後用插值數據重新解釋該行。所以沒有必要以任何方式逃避這一點。

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

+0

感謝您給出的很好的答案和真正有用的文章 - 它有助於更​​全面地理解這些問題。 – Ryan