2016-02-05 63 views
-1

我在這裏提出一個項目的問題;我試圖儘可能地解釋:只能運行HTML(PHP)

我有一個文本區域,用戶可以在其中寫任何他們想要的東西。 的問題是,他們可以嘗試某種惡意代碼(JS XSS,例如) 我用的功能:

echo htmlspecialchars($topic->getMessage(), ENT_QUOTES, 'UTF-8'); 

我想我已經解決了這個問題,但我記得,用戶可以鍵入HTML,並且它是允許的。

是否有任何功能已經爲運行HTML和其他人保持爲文本?

+0

所以,你想允許某些HTML元素/屬性,但過濾掉其他任何東西?不,沒有內置函數,但有外部工具/庫,如f.e. http://htmlpurifier.org/ – CBroe

+0

@CBroe tks,解決了我的問題! – NaDa

回答

0

htmlspecialchars是好的,但不是完全安全的插入到MySQL。

對於MySQL,最好用準備好的語句,如這裏說明: http://bobby-tables.com/php.html

在頁面輸出(未插入數據庫),用htmlspecialchars就足夠了...提供之前沒有這些解碼打印。

像CBroe建議的那樣,您可以使用http://htmlpurifier.org/來清理html並避免數據庫中出現垃圾,但仍然必須使用預處理語句。

也讀爲:http://php.net/manual/en/pdo.prepared-statements.php

3

作爲每PHP manualhtmlspecialchars執行下面的轉換:

'&'(符號)變成'&'

'"'(雙引號)變得'"'當沒有設置ENT_NOQUOTES。

"'"(單引號)只有當設置了ENT_QUOTES時變爲'''(或')。

'<'(小於)成爲(大於)'&lt;'

'>'成爲'&gt;'

你的HTML實際上並得到轉換成安全的字符。

再次閱讀您的問題(它不是很清楚)後,我想也許你想要的HTML標籤居然留的HTML標籤,這意味着<b>bold</b>不會得到翻譯成&lt;b&gt;bold&lt;/b&gt;

要做到這一點,你可能要使用str_replacehtmlspecialchars

$result = htmlspecialchars($topic->getMessage(), ENT_QUOTES, 'UTF-8'); 
$result = str_replace(array("&lt;","&gt;"), array("<",">"), $result); 
echo $result; 

或者您也可以通過str_replace翻譯&'(單引號)和"(雙引號):

echo str_replace(array("&", "\"", "'"), array("&amp;", "&quot;", "&#039;"), $topic->getMessage()); 

可能性是無止境的。