簡體   English   中英

驗證用戶輸入?

[英]Validating user input?

我對某些事情感到非常困惑,並且想知道是否有人可以解釋。

在PHP中我驗證用戶輸入所以htmlentitiies,mysql_real_escape_string在插入數據庫之前使用,而不是在所有內容上,因為我喜歡使用正則表達式,盡管我發現它們很難處理。 現在顯然我將使用mysql_real_escape_string,因為數據進入數據庫但不確定我是否應該使用htmlentities()僅在從數據庫獲取數據並將其顯示在網頁上時這樣做才能改變由人輸入的數據是不保留它的原始形式,如果我想稍后使用該數據用於其他東西,可能會導致問題。

例如,我有一個帶有3個字段名稱,主題和消息的留言簿。 現在顯然字段可以包含任何像js標簽中的惡意代碼基本上什么,現在讓我困惑的是讓我說我​​是一個惡意的人,我決定使用js標簽和一些惡性js代碼並提交表單,現在基本上我有惡意我的數據庫中無用的數據。 現在通過使用htmlentities將惡意代碼輸出到網頁(留言簿)這不是問題,因為htmlentities已將其轉換為安全等價物,但同時我在數據庫中有無用的惡意代碼,我寧願不擁有。

所以在說完這一切之后我的問題是我應該接受這樣一個事實,即數據庫中的某些數據可能是惡意的,無用的數據,只要我在輸出中使用htmlentities一切都會好的,或者我應該做其他事情嗎?

我讀了很多書,說過在接收數據時過濾數據並在輸出數據時將其轉義,因此保留了原始表單但是他們只提供了一些示例,例如確保字段只是使用已經內置到php中的函數的int但我從未找到過任何關於確保類似於留言簿的內容,您希望用戶輸入他們想要的任何內容,還有除了mysql_real_escape_string()之外如何過濾這些數據以確保它不會破壞數據庫查詢?

請有人請最終為我解決這個困惑並告訴我應該做什么以及最佳做法是什么?

感謝任何可以解釋的人。

干杯!

這是一個很長的問題,但我認為你實際上要問的是:

“在將HTML插入我的數據庫之前,或者當我去顯示它時,我應該逃避HTML嗎?”

這個問題的普遍接受的答案是,當你將HTML顯示給用戶時,你應該逃避HTML(通過htmlspecialchars ),而不是在將它放入數據庫之前。

原因是:數據庫存儲數據。 你輸入的是用戶鍵入的內容。 當你調用mysql_real_escape_string ,它不會改變插入數據庫的內容; 它只是避免將用戶的輸入解釋為SQL語句。 htmlspecialchars對HTML做同樣的事情; 當您打印用戶的輸入時,它將避免將其解釋為HTML。 如果你在插入之前調用htmlspecialchars ,你就不再忠實了。

您應該始終努力獲得最高保真度的表示。 由於在您的數據庫中存儲“惡意”代碼沒有任何危害(實際上,它節省了一些空間,因為轉義的HTML比未轉義的更長!),並且您將來可能需要該HTML(如果您使用XML解析器,那該怎么辦?對於用戶評論,或者有一天讓受信任的用戶在他們的評論中有一個HTML的子集,或者其中一些?),為什么不讓它?

您還要了解其他類型的輸入驗證(整數約束等)。 您的數據庫模式應該強制執行這些模式,也可以在應用程序層檢查它們(最好是通過JS輸入,然后再輸入服務器端)。

另一方面,使用PHP進行數據庫轉義的最佳方法可能是使用PDO,而不是直接調用mysql_real_escape_string PDO具有更高級的功能,包括類型檢查。

mysql_real_escape_string()是數據庫操作所需的全部內容。 它將確保惡意用戶無法將某些內容嵌入到會“破壞”您的查詢的數據中。

當您正在向客戶端/瀏覽器發送內容時, htmlentities()htmlspecialchars()會發揮作用。 如果你想清理潛在的惡意HTML,你最好使用HTMLPurifier ,它會將數據剝離到基岩並用漂白劑將其軟管化並正確重建。

如果你在HTML出現時逃避HTML,沒有理由擔心數據庫中存在惡意JavaScript代碼。 只要確保你總是逃避數據庫中的任何事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM