2010-12-13 31 views
2

這是我真的沒有得到的東西之一。我知道逃離任何用戶發送的數據是非常重要的。有很多方法如何做到這一點:stripslashes()(刪除反斜槓),strip_tags(刪除HTML和PHP標記),htmlSpecialChars(例如,更改&爲&),正則表達式(preg_match())不允許處理「壞」數據。轉義用戶發送數據?

何時使用,如何使用,爲什麼要使用?

+0

可能重複[在哪裏清理PHP $ _POST \ [\]輸入?](http ://stackoverflow.com/questions/2401706/where-to-sanitize-php-post-input) – ajreal 2010-12-13 15:36:57

+0

沒有「壞數據」。 – 2010-12-13 16:19:54

+0

這就是它的「壞數據」,而不是壞數據。 = P – daGrevis 2010-12-13 16:36:38

回答

2

如果你把$_POST['album_name']的內容直接放在你的頁面上,那麼有人可能會提交HTML和JavaScript,然後它們會成爲頁面的一部分,現在你的網站被黑了。

或者,您可以將$_POST['album_name']的內容放入SQL查詢中。但是用戶已經編寫了他們自己的SQL查詢,現在你已經運行了,現在你的數據庫被黑了。

http://xkcd.com/327/

1

這個問題是非常廣闊的。這實際上取決於你在逃避數據。

每個示例使用stripslashesstrip_tags適用於轉義要在Web瀏覽器中顯示的數據。但對數據庫查詢來說並不好。另一方面,在將用戶數據發送到數據庫引擎時,數據庫轉義機制很好,但在防止XSS攻擊時它們並不好。

每個轉義函數都有一個必須使用的特定上下文。

1

順便說一句:在PHP中過濾用戶輸入數據的最佳做法是使用filter_input

實例:

$userId = filter_input(INPUT_GET, 'user_id', FILTER_SANITIZE_NUMBER_INT); 
$username = filter_input(INPUT_GET, 'username', FILTER_SANITIZE_SPECIAL_CHARS); 
$email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL); 

更多過濾常數here

+0

我很同意你的想法,但我不同意使用的方法。 'filter_input'與'filter_var'的作用相同,但是直接作用於輸入流。這使得事後進行單元測試很困難。就像[這傢伙嘗試]一樣(http://stackoverflow.com/questions/4158307/how-to-make-a-phpunit-test-that-depends-on-real-post-get-data)。 – netcoder 2010-12-13 15:59:29

+0

問題:PHP 5> = 5.2.0。 – daGrevis 2010-12-13 16:38:04

+0

PHPUnit測試單元的情況下。爲了測試Web案例,Selenium是一個不錯的選擇。 – joksnet 2010-12-13 17:25:42

0

如果您的數據正在進入數據庫,您必須阻止用戶發送數據,這些數據將從您的正常查詢中跳出來破壞或修改該查詢。使用帶參數綁定的MySQLi是保護數據庫的最佳方式。只要你還使用字符串或preg替換。所以確保整數ID只是一個整數。你想從你的數據中邏輯上刪除儘可能多的字符。

如果您的數據將被放置在標籤之間,strip_tags後跟htmlentities是一個好習慣。但是,如果您可以使用白名單,請執行。如果你知道輸出只能是一個整數,確保它是。 echo htmlentities(strip_tags($value));

如果您要將該數據放置在標籤<a href='<?php echo $value; ?>'>以上是不夠的。您還必須替換單引號。在這裏,更重要的是你可以防止有毒數據進入系統。如果$ value類似' onClick='alert("oops");',你可能會陷入嚴重的困境。在這裏你絕對應該使用白名單,並且只允許用戶輸入的內容出現在這裏,如果你絕對必須的話。

如果你想輸出到JavaScript。別。即使您多年來一直在使用安全性,您也不應該這樣做。然而。一個例外可以用於非常具體的值。整數。被鎖定到A-ZA-Z0-9的字符串以及用preg替換的空間。然而。這是非常危險的,可以嚴重危害你的系統。

如果你想把變量放在一個eval或exec中。只是不。你不夠聰明來阻止攻擊。我也沒有。沒有人。有人找到方法只是時間問題。如果第一次編寫的代碼很好?在稍後的日期,代碼將會改變,不會再好了。只是不要這樣做。期。或者有一天,你會坐在監獄裏想着自己,「但我沒有入侵五角大樓......」