5 回答

TA貢獻2036條經驗 獲得超8個贊
這是一種常見的誤解,即用戶輸入可以被過濾。PHP甚至還有一個(現已棄用的)“功能”,稱為魔術引號,它建立在這個想法的基礎之上。這是胡說八道。忘記過濾(或清潔,或任何人稱之為)。
為了避免出現問題,你應該做的很簡單:每當你在外國代碼中嵌入一個字符串時,你必須根據該語言的規則來逃避它。例如,如果在某些SQL目標MySql中嵌入字符串,則必須為此目的使用MySql函數轉義字符串(mysqli_real_escape_string
)。(或者,對于數據庫,如果可能,使用預處理語句是更好的方法)
另一個例子是HTML:如果在HTML標記中嵌入字符串,則必須使用它進行轉義htmlspecialchars
。這意味著每個單詞echo
或print
語句都應該使用htmlspecialchars
。
第三個例子可能是shell命令:如果你要將字符串(例如參數)嵌入到外部命令中,并用它們調用它們exec
,那么你必須使用escapeshellcmd
和escapeshellarg
。
等等等等 ...
您需要主動過濾數據的唯一情況是,您是否接受預先格式化的輸入。例如。如果您允許用戶發布HTML標記,那么您計劃在網站上顯示該標記。但是,你應該不惜一切代價避免這種情況,因為無論你如何過濾它,它總是一個潛在的安全漏洞。

TA貢獻1744條經驗 獲得超4個贊
不可以。如果沒有任何上下文,您無法對數據進行一般過濾。有時您想要將SQL查詢作為輸入,有時您希望將HTML作為輸入。
您需要過濾白名單上的輸入 - 確保數據符合您期望的某些規范。然后,您需要在使用它之前將其轉義,具體取決于您使用它的上下文。
轉義SQL數據的過程 - 防止SQL注入 - 與轉換(X)HTML數據的過程非常不同,以防止XSS。

TA貢獻1794條經驗 獲得超8個贊
不,那里沒有。
首先,SQL注入是一個輸入過濾問題,XSS是一個輸出轉義問題 - 所以你甚至不會在代碼生命周期中同時執行這兩個操作。
基本的經驗法則
對于SQL查詢,綁定參數(與PDO一樣)或對查詢變量使用驅動程序本機轉義函數(例如
mysql_real_escape_string()
)使用
strip_tags()
過濾掉不需要的HTMLhtmlspecialchars()
在此處轉義所有其他輸出并注意第二和第三參數。
- 5 回答
- 0 關注
- 669 瀏覽
添加回答
舉報