2014-10-27 43 views
6

我一直在使用PHP一段時間,我開始問自己,如果我養成良好的習慣。消毒PHP變量,我過度使用它嗎?

其中之一是我相信了由過度使用PHP的消毒方法,例如,一個用戶通過表單註冊時,我得到了下面的帖子變量:

$_POST['name']$_POST['email']$_POST['captcha']。現在,我通常所做的顯然是清理我將要放入MySQL的數據,但是在比較驗證碼時,我也會對其進行清理。因爲我相信我誤解了PHP消毒,我很好奇,有什麼其他的情況,當你需要清理數據,除了使用它來放置在MySQL中的東西(注意我知道消毒也是需要防止XSS攻擊) 。而且,我的習慣是消除幾乎每個來自用戶輸入的變量,一個糟糕的變量?

+8

永遠不要相信用戶輸入是最好的習慣之一。數據庫注入是顯而易見的原因,但還有其他一些。 eval()語句,動態類創建$ x = new $ classnamehere()等 – STLMikey 2014-10-27 21:25:20

+3

所有用戶輸入/外部輸入都有潛在危險,所以如果 - 例如 - 你將captcha值與內部字符串進行比較,一些(儘管很小)的風險是,傳入的價值可能會「欺騙」並以某種方式通過比較邏輯。有了這個說法,是的,一些輸入需要比其他輸入消毒更多,因爲一些數據用於高風險場景。如果可能的話,我建議通過一些通用函數清理所有用戶輸入,並使用MySQLi或PDO自動轉義任何數據來抵禦注入風險。 – Anthony 2014-10-27 21:29:36

+2

我相信這是一個好習慣,事實上 - 我相信你的應用程序不應該觸及任何用戶輸入的數據,而不會首先進行消毒處理 - 我有一個類通過post/get請求循環並生成消毒版本,然後我可以訪問它們 – 2014-10-27 21:30:18

回答

3

每當您將數據存儲到某個位置,並且該數據將被讀取/提供給(毫無戒心的)用戶時,則必須對其進行清理。因此,應該照顧可能會改變用戶體驗的東西(不一定只是數據庫)。一般來說,所有的用戶輸入都被認爲是不安全的,但是在下一段你會看到有些東西可能仍然被忽略,儘管我不推薦它。

只發生在客戶端上的東西只是爲了更好的用戶體驗(用戶體驗,考慮表單的JS驗證 - 從安全角度考慮它是無用的,因爲它很容易避免,但它可以幫助非惡意用戶擁有與網站有更好的互動),但基本上它不會造成任何傷害,因爲會議結束後數據(好或壞)都會丟失。您可以隨時銷燬自己的網頁(在您的機器上),但問題是有人可以爲其他人做。

要更直接回答您的問題 - 永遠不要過度擔心。安全總比對不起更好,成本通常不會超過幾毫秒。

3

您需要搜索的術語是FIEO。過濾器輸入,逃逸輸出。

如果你不瞭解這個基本原理,你很容易混淆自己。

想象一下,PHP是中間的男人,它用左手接受並且與右邊接觸。

用戶使用您的表單並填寫日期表單,所以它應該只接受數字,也許,破折號。例如NNNNN-NN-NN。如果你得到的東西不符合,就拒絕它。

這是一個過濾的例子。

接下來的PHP,做一些事情,可以說它存儲在一個Mysql數據庫。

Mysql需要的是防止SQL注入,因此您使用PDO或Mysqli的準備語句來確保即使您的篩選失敗,您也無法對數據庫進行攻擊。這是Escaping的一個例子,在這種情況下,轉義爲SQL存儲。

後來,PHP從您的數據庫中獲取數據並將其顯示到HTML頁面上。因此,您需要轉義下一個媒介HTML的數據(這是您可以允許XSS攻擊的地方)。

在您的腦海中,您必須將每個PHP的「保護性」功能劃分爲這兩個系列中的一個,即過濾或轉義。

自由文本字段當然比過濾日期更復雜,但沒關係,堅持原則,你會沒事的。

希望這有助於http://phpsec.org/projects/guide/

+0

其實你只是回答所有問題我有一段時間在腦海中。現在我明白了準備好的陳述來得方便,而且在哪裏逃避是必要的。謝謝 :) – 2014-10-27 22:39:50