我應該使用htmlentities
和strip_tags
嗎?strip_tags和htmlentities
我正在使用strip_tags
添加到數據庫並考慮刪除輸出上的htmlentities
;我想在服務器上生成HTML時避免不必要的處理。
僅使用strip_tags
沒有允許的標籤是否安全?
我應該使用htmlentities
和strip_tags
嗎?strip_tags和htmlentities
我正在使用strip_tags
添加到數據庫並考慮刪除輸出上的htmlentities
;我想在服務器上生成HTML時避免不必要的處理。
僅使用strip_tags
沒有允許的標籤是否安全?
第一:只在需要時才使用轉義方法。即如果將某些內容插入數據庫中,則只能將其轉義爲數據庫,即應用mysql_real_escape_string
(或PDO->quote
或您正在使用的任何數據庫層)。但是還沒有對輸出應用任何轉義。沒有strip_tags
或類似的。這是因爲您可能想要將數據庫中存儲的數據用於其他地方,其中HTML轉義不是必需的,但僅使文本變得醜陋。
第二:你不應該使用strip_tags
。它完全刪除了標籤。即用戶沒有得到與他輸入相同的輸出,而是使用htmlspecialchars
。它會給用戶相同的輸出,但會使其無害。
strip_tags
將刪除所有的HTML標籤:
"<b>foo</b><i>bar</i>" --> "foobar"
htmlentities
將編碼如果使用htmlentities
這是在HTML
"a & b" --> "a & b"
"<b>foo</b>" --> "<b>foo</b>"
特殊字符的字符,那麼當你輸出字符串到瀏覽器,用戶應該看到他們輸入的文本,而不是HTML
echo htmlentities("<b>foo</b>");
個
目測結果:< B>富</B>
echo strip_tags("<b>foo</b>");
結果:FOO
我不會使用ヶ輛,因爲這將允許你插入的字符串是到數據庫,對賬戶細節或論壇沒有好處。
使用mysql_real_escape_string
插入到數據庫中,並用strip_tags從數據庫recreiving和呼應到屏幕
試試這個,看看差別:
<?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>"
這應該得到你想要的和安全!
@Beck我刪除了我的答案,因爲仔細觀察,我不確定strip_tags()是否實際上是不安全的。我開始了一個關於[這裏]的具體問題(http://stackoverflow.com/questions/5788527/is-strip-tags-vulnerable-to-scripting-attacks)。 – 2011-04-26 09:37:51
好的隊友:)我想我將不得不爲自己找到一個適當的生成頁面緩存工具,而你決定是否安全。 :P – Somebody 2011-04-26 09:50:19
是啊! :)供參考,從我的問題的HTML淨化器鏈接:http:// htmlpurifier。org /但你爲什麼要首先在'htmlspecialchars()'上使用'strip_tags()',有什麼特別的理由? – 2011-04-26 09:51:14