我在這裏提出一個項目的問題;我試圖儘可能地解釋:只能運行HTML(PHP)
我有一個文本區域,用戶可以在其中寫任何他們想要的東西。 的問題是,他們可以嘗試某種惡意代碼(JS XSS,例如) 我用的功能:
echo htmlspecialchars($topic->getMessage(), ENT_QUOTES, 'UTF-8');
我想我已經解決了這個問題,但我記得,用戶可以鍵入HTML,並且它是允許的。
是否有任何功能已經爲運行HTML和其他人保持爲文本?
我在這裏提出一個項目的問題;我試圖儘可能地解釋:只能運行HTML(PHP)
我有一個文本區域,用戶可以在其中寫任何他們想要的東西。 的問題是,他們可以嘗試某種惡意代碼(JS XSS,例如) 我用的功能:
echo htmlspecialchars($topic->getMessage(), ENT_QUOTES, 'UTF-8');
我想我已經解決了這個問題,但我記得,用戶可以鍵入HTML,並且它是允許的。
是否有任何功能已經爲運行HTML和其他人保持爲文本?
htmlspecialchars是好的,但不是完全安全的插入到MySQL。
對於MySQL,最好用準備好的語句,如這裏說明: http://bobby-tables.com/php.html
在頁面輸出(未插入數據庫),用htmlspecialchars就足夠了...提供之前沒有這些解碼打印。
像CBroe建議的那樣,您可以使用http://htmlpurifier.org/
來清理html並避免數據庫中出現垃圾,但仍然必須使用預處理語句。
也讀爲:http://php.net/manual/en/pdo.prepared-statements.php
作爲每PHP manual,htmlspecialchars
執行下面的轉換:
'&'
(符號)變成'&'
'"'
(雙引號)變得'"'
當沒有設置ENT_NOQUOTES。
"'"
(單引號)只有當設置了ENT_QUOTES時變爲'''
(或'
)。
'<'
(小於)成爲(大於)'<'
'>'
成爲'>'
你的HTML實際上並得到轉換成安全的字符。
再次閱讀您的問題(它不是很清楚)後,我想也許你想要的HTML標籤居然留的HTML標籤,這意味着<b>bold</b>
不會得到翻譯成<b>bold</b>
要做到這一點,你可能要使用str_replace
後htmlspecialchars
:
$result = htmlspecialchars($topic->getMessage(), ENT_QUOTES, 'UTF-8');
$result = str_replace(array("<",">"), array("<",">"), $result);
echo $result;
或者您也可以通過str_replace
翻譯&
,'
(單引號)和"
(雙引號):
echo str_replace(array("&", "\"", "'"), array("&", """, "'"), $topic->getMessage());
可能性是無止境的。
所以,你想允許某些HTML元素/屬性,但過濾掉其他任何東西?不,沒有內置函數,但有外部工具/庫,如f.e. http://htmlpurifier.org/ – CBroe
@CBroe tks,解決了我的問題! – NaDa