2009-10-29 60 views
4

最近,我在一些客戶的網站上進行了審計。他們回來的一件事是,我可以更好地清理輸入數據,因爲人們仍然可能對數據庫造成潛在的傷害。我還應該做些什麼來消毒用戶輸入?

下面的函數是我正在使用的(舊開發人員的剩餘部分),但是我看不到潛在問題可能在哪裏。

傳遞到數據庫的字符串將通過XML顯示,然後由Flash應用程序讀取。

有誰能告訴我我可能會錯過什麼嗎?謝謝

function secure_string($string) 
{ 
    return (strip_tags(addslashes(mysql_real_escape_string(
         stripslashes($string))))); 
} 
+1

顯示你所需要的是字符串,而不是當前的功能。保護取決於你想要防範的事情。 – scragar 2009-10-29 10:01:48

+0

@scragar,MySQL注入。至少他說客戶說:「對數據庫有潛在危害」。 – Frankie 2009-10-29 10:07:42

+7

我不會做PHP(不再),但是,誠實地說,在一個鏈中調用'addslashes'和'stripslashes'確實給我的眼睛帶來了一滴眼淚。 – shylent 2009-10-29 10:44:30

回答

5

更好地使用新的PHP功能filter_var()進行清潔輸入。新的和更好的。

+0

感謝兄弟。過濾器var目前看來是最好的選擇。 – Drew 2009-10-29 14:16:29

5

看起來好像有太多的功能正在進行。 mysql_real_escape_string()已經逃脫了你需要逃脫的所有事情,所以沒有必要運行addslashes()。事實上,它可以通過逃避mysql_real_escape_string()創建的反斜槓而產生更多的傷害。

+0

只是爲了提示,有一個像mysql_real_escape_string()函數,但爲postgresql? pg_escape_string或pg_escape_bytea似乎不適用於注入 – Strae 2009-10-29 13:30:40

+0

「pg_escape_string」如何工作?它應該工作得很好。儘管'pg_query_params'是更好的方式來運行查詢。 – 2009-10-29 14:45:27

1

取決於使用「安全」字符串的位置。如果它將用於數據庫中,則只需要mysql_real_escape_string(),僅此而已。如果它將以html格式顯示,則只需要htmlentities(),僅此而已。簡而言之:你的代碼太多了,甚至可能是有害的。

如果您希望將其存儲在數據庫中,以便稍後在html中顯示它(例如評論),則在存儲字符串時應使用mysql_real_escape_string(),而在顯示時應使用htmlentities()

2

mysql_real_escape_string是最後一步,您不應該將它用於您的應用程序邏輯。唯一的目的是將字符串傳遞給數據庫,所以只有在構建查詢時才使用它。您可以將任何內容傳遞給mysql_real_escape_string,並確保您可以安全地將其存儲在數據庫中。

其餘的,這取決於你想要什麼。如果您想剝離標籤,請使用strip_tags等。

+0

該字符串被輸出到一個xml文件,該文件又被Flash應用程序讀取。謝謝 – Drew 2009-10-29 10:10:07

+0

如果將它添加到XML文件中,則在將它添加到XML文件時,應將其轉義爲XML *。在這裏,您正在處理將字符串添加到數據庫,因此您將其轉義爲數據庫。您需要爲不同的目的使用不同的驗證/轉義函數。 – 2009-10-29 10:13:41

+0

謝謝你!當我解壓時,我不會擔心理智! :) – Drew 2009-10-29 14:14:42

1

如果您的服務器使用php 5.2或更高版本,則應該使用filter_var作爲XML部分。

$output = filter_var($input, FILTER_SANITIZE_STRING); 

要將某些內容存儲到數據庫中,請使用PDO和參數化查詢。