2012-08-09 69 views
1

我想弄清楚在輸入數據和輸出數據時,最好在不同情況下使用哪些函數。PHP用戶輸入數據安全

當我允許用戶向MySQL輸入數據什麼是保護數據以防止SQL注入和其他任何類型的注入或黑客攻擊的最佳方式?

當我從數據庫輸出數據爲普通html什麼是最好的方法來做到這一點,所以腳本等無法運行?

目前,我基本上只用

mysql_real_escape_string(); 

的數據輸入到數據庫之前,這似乎做工精細,但我想知道這是所有我需要做的,或者某些其他方法比較好。

而此刻我用

stripslashes(nl2br(htmlentities())) 

(大部分時間反正)輸出數據。我找到我通常使用他們的這些工作正常,但是我遇到了與ヶ輛有問題,我希望能夠分別有一些html標籤輸出,例如:

<ul></ul><li></li><bold></bold> 

等,但我不能。

任何幫助將是偉大的,謝謝。

+0

你可能想看看http://bobby-tables.com/ – irrelephant 2012-08-10 00:00:02

+0

謝謝,但是我看過之前,它對我來說並沒有多大意義。 :\ – 2012-08-10 00:05:21

回答

3

我同意mikikg,您需要先了解SQL注入和XSS漏洞,然後才能嘗試針對這些類型的問題保護應用程序。

但是,我不同意他的斷言使用正則表達式來驗證用戶輸入作爲SQL注入預防器。是的,儘可能地驗證用戶輸入。但不要依靠這個來防止注入,因爲黑客經常打破這些類型的過濾器。另外,不要對你的過濾器過於嚴格 - 很多網站不會讓我登錄,因爲我的名字中有一個撇號,讓我告訴你,當發生這種情況時,這是一個痛苦。

您提到的問題有兩種安全問題。第一個是SQL注入。這個漏洞是一個「解決的問題」。也就是說,如果您使用參數化查詢,並且絕不會以參數的形式傳遞用戶提供的數據,那麼無論發生什麼情況,數據庫都會爲您執行「正確的事情」。對於很多數據庫來說,如果使用參數化查詢,那麼就沒有機會進行注入,因爲數據實際上並不是嵌入到SQL中,而是通過在導線上以前綴長度或類似長度的長度傳遞數據。這比數據庫轉義函數具有更高的性能,並且可以更安全。 (注意:如果使用在數據庫上生成動態SQL的存儲過程,它們可能也存在注入問題!)

您提到的第二個問題是跨站點腳本問題。如果您希望允許用戶提供HTML,而不先實體轉義,則此問題是一個開放的研究問題。完全可以這麼說,如果你允許用戶傳遞某種HTML,那麼你的系統很可能會在某個時刻遭受一個XSS問題的攻擊。現在,針對這個問題的最新技術是使用像HTMLPurifier這樣的庫來「過濾」服務器上的數據。攻擊者可以並且經常打破這些過濾器;但至今還沒有人發現保護這些應用程序的更好方法。您最好只允許使用特定的HTML標記白名單,並且實體編碼其他任何內容。

0

在您的php配置中,應該關閉magic_quotes_gpc。所以你不需要stripslashes。對於SQL,請查看PDO's prepared statements

而對於您的自定義標籤,由於它們只有三個,您可以在htmlentities的調用之後執行preg_replace調用,在將它們插入數據庫之前將其轉換回來。

+0

感謝您的回答,就magic_quotes_gpc和stripslashes而言,我需要stripslashes,因爲我在提交表單時使用jQuery序列化,所以顯然它和magic_quotes的功能相同。 – 2012-08-10 00:18:59

+0

@Dylan:那麼你應該在數據進入數據庫之前做'stripslashes'。數據庫中的內容不應該有應用於表示層的考慮事項(比如stripslashes) - 你永遠不知道是否要在不是HTML頁面的某個地方使用相同的數據,並試圖做到這一點到處都是脖子上的痛苦。 – 2012-08-10 01:48:13

1

這是最棘手的任務之一今天:)

你需要知道的注入等攻擊方法是如何工作的SQL。對https://www.owasp.org/index.php/Main_Page中的每種方法都有非常詳細的解釋,並且還提供了PHP的整個安全框架。

在某些框架中使用特定的安全庫也是在CodeIgniter或Zend中的不錯選擇。

接下來,儘量使用REGEXP,並將模式規則粘貼到特定的輸入格式。

使用您的框架的預處理語句或活動記錄類。

如果您確實需要數字值,請始終使用(int)$_GET['myvar']來投射您的輸入。

有很多其他規則和方法來保護您的應用程序,但是一條黃金法則是「永遠不要相信用戶的輸入」。

+1

不!不要使用正則表達式作爲SQL注入預防器來驗證用戶輸入。人們**會**想辦法打破你的過濾器,或利用正則表達式引擎中的錯誤。使用轉義(yuck)或參數化查詢(yay)來防止此類攻擊;這就是這些設計的目的。請注意,您沒有解決用戶問題的XSS部分。 – 2012-08-10 01:46:23