2011-04-26 75 views
8

我應該使用htmlentitiesstrip_tags嗎?strip_tags和htmlentities

我正在使用strip_tags添加到數據庫並考慮刪除輸出上的htmlentities;我想在服務器上生成HTML時避免不必要的處理。

僅使用strip_tags沒有允許的標籤是否安全?

+0

@Beck我刪除了我的答案,因爲仔細觀察,我不確定strip_tags()是否實際上是不安全的。我開始了一個關於[這裏]的具體問題(http://stackoverflow.com/questions/5788527/is-strip-tags-vulnerable-to-scripting-attacks)。 – 2011-04-26 09:37:51

+0

好的隊友:)我想我將不得不爲自己找到一個適當的生成頁面緩存工具,而你決定是否安全。 :P – Somebody 2011-04-26 09:50:19

+0

是啊! :)供參考,從我的問題的HTML淨化器鏈接:http:// htmlpurifier。org /但你爲什麼要首先在'htmlspecialchars()'上使用'strip_tags()',有什麼特別的理由? – 2011-04-26 09:51:14

回答

14

第一:只在需要時才使用轉義方法。即如果將某些內容插入數據庫中,則只能將其轉義爲數據庫,即應用mysql_real_escape_string(或PDO->quote或您正在使用的任何數據庫層)。但是還沒有對輸出應用任何轉義。沒有strip_tags或類似的。這是因爲您可能想要將數據庫中存儲的數據用於其他地方,其中HTML轉義不是必需的,但僅使文本變得醜陋。

第二:你不應該使用strip_tags。它完全刪除了標籤。即用戶沒有得到與他輸入相同的輸出,而是使用htmlspecialchars。它會給用戶相同的輸出,但會使其無害。

9

strip_tags將刪除所有的HTML標籤:

"<b>foo</b><i>bar</i>" --> "foobar" 

htmlentities將編碼如果使用htmlentities這是在HTML

"a & b" --> "a &amp; b" 
"<b>foo</b>" --> "&lt;b&gt;foo&lt;/b&gt;" 

特殊字符的字符,那麼當你輸出字符串到瀏覽器,用戶應該看到他們輸入的文本,而不是HTML

echo htmlentities("<b>foo</b>"); 

目測結果:< B>富</B>

echo strip_tags("<b>foo</b>"); 

結果:FOO

+0

伴侶我知道他們在做什麼。我問的是strip_tags足以輸出數據而不使用htmlentities? – Somebody 2011-04-26 09:27:14

+0

猜測我必須開始考慮緩存生成的頁面。有人可以爲這樣的任務建議好的緩存工具嗎? :) – Somebody 2011-04-26 09:36:17

+0

@Beck:好的,你期望的結果是什麼?你想不要有HTML嗎?你只關心SQL注入嗎? – nickf 2011-04-26 09:51:32

3

我不會使用ヶ輛,因爲這將允許你插入的字符串是到數據庫,對賬戶細節或論壇沒有好處。

使用mysql_real_escape_string插入到數據庫中,並用strip_tags從數據庫recreiving和呼應到屏幕

0

試試這個,看看差別:

<?php 

    $d= isset($argv[1]) ? $argv[1] : "empty argv[1]".PHP_EOL; 
    echo strip_tags(htmlentities($d)) . PHP_EOL; 
    echo htmlentities(strip_tags($d)) . PHP_EOL; 

?> 

打開CMD或終端和鍵入如下內容;

php your_script.php "<br>foo</br>" 

這應該得到你想要的和安全!