2010-10-29 71 views
7

爲什麼很多人在字符串上使用這兩個函數? 我看到了很多的stripslashes(strip_tags($field));(或者反過來)轉義數據 - stripslashes,strip_tags

是不是strip_tags足以過濾任何XSS的東西,這樣的事情?

回答

9

轉義數據與strip_tagsstripslashes無關。這些函數會過濾字符串中的某些字符,而「轉義」則對某些字符進行編碼,以使它們不會被瀏覽器或數據庫解釋。

您可以使用strip_tags刪除從瀏覽器發送到PHP的字符串中的HTML標記。更好的是,如果您使用htmlspecialchars來轉義任何可能在將數據發送回瀏覽器時定界標記的字符,則您可以安全地存儲相同的數據,而不會通過strip_tags

stripslashes從字符串中刪除斜槓,如果啓用了「魔術引號」,則只需要擔心它。這是PHP開發人員天真地認爲來自瀏覽器的每一部分數據都指向數據庫並且開發人員無法信任自己逃脫數據庫的原因。

2

當魔術引號打開時,它會自動在所有POST,GET等變量中轉義引號。在您使用數據之前,stripslashes會刪除這些數據。 Strip標籤嘗試刪除所有的html標籤。

5

是不是strip_tags足以過濾任何xss的東西和這樣的事情?

沒有。過濾掉XSS東西的唯一安全方法是htmlspecialchars(),儘管我看到許多建議使用strip_tags()另外。

參見例如在這個問題上的討論:Is preventing XSS and SQL Injection as easy as does this…

什麼stripslashes應該在這方面做,我不知道。這可能是一個試圖撤消現在不推薦使用的函數的效果 - 但是如果不首先檢查是否啓用了該特定函數,則不應該應用該函數。

0

stripslashes()通常用於已啓用Magic Quotes的服務器。由於魔術引號已被棄用(而不是推薦),你可能正在尋找的是addslashes(),這是爲了防止SQL注入。例如,如果你的SQL語句如下:

SELECT * FROM users WHERE username='$username' AND password = '$password' 

沒有和addslashes(),可以通過用戶名設置做一個SQL注入:換句話說

admin'-- 

所以,和addslashes() - 或更好的是,mysql_real_escape_string() - 用於防止SQL注入,而strip_tags()用於防止XSS注入。

+1

你可能指的是'addslashes()'。但是這絕不能用於清理SQL語句。就像你說的那樣,總是使用數據庫包裝器的本地轉義函數作爲'mysql_ *'函數,即'mysql_real_escape_string()'。 – 2010-10-29 21:15:33

+1

'stripslashes'根本不會這樣做,並且與爲數據庫準備數據無關...... – meagar 2010-10-29 21:20:05

+1

對不起,這裏有點困惑。 (笑嘻嘻)固定! – jusunlee 2010-10-29 22:12:55

1

strip_tags()通常不足以防止XSS自己的攻擊,因此最好謹慎一些。

考慮以下幾點:

$str = "' onclick='javascript:alert(0);' alt='"; 
echo "<a href='". strip_tags($str) ."'></a>"; 
// output is <a href='' onclick='javascript:alert(0);' alt=''></a> 

一個並不總是需要HTML標記來執行XSS攻擊。這可能是一個不太有效的攻擊,但它仍然是一個潛在的攻擊媒介。

1

我注意到strip_tags()在引號中加了反斜槓。我已檢查並且magic_quotes_gpc未啓用。 OP的原始問題是爲什麼一些編碼人員用stripslashes()包圍strip_tags(),這就是爲什麼我這樣做的原因,因爲我不希望數據庫存儲雙反斜槓,因爲在將數據保存到數據庫之前,我已經準備好了我的數據。