2012-03-04 39 views
0

當前正在完成我的評論系統的編碼,並且希望它能夠使用Stack Overflow如何處理他們的帖子等,我希望我的用戶能夠使用BOLD,Italic和Underscore只是,要做到這一點,我會用以下內容:剝離輸入以完成純文本

_文字_ *加粗* -Italic-

現在,首先我想知道剝離評論完全乾淨的任何一種方式標籤,html實體等,例如,如果用戶使用任何html/php標籤,他們將從輸入中刪除。

我目前使用Strip_tags,但即使已經做出濫用或blatent XSS /注入嘗試,但可以使輸出看起來非常討厭,我仍然希望純文本輸出完整,而不是因爲strip_tags似乎讓它變得絕對混亂。

接下來我會做的是用粗體的html標籤替換星號,等等,在剝掉html標籤內容的乾淨之後。

人們如何建議我這樣做,目前這是評論的sanitize函數

function cleanNonSQL($str) 
{ 
    return strip_tags(stripslashes(trim($str))); 
} 
+1

在輸出用戶提供的內容之前,請務必使用'htmlspecialchars',它很好(不能有XSS)。有幾個優點(確保文本的編碼與你所說的「htmlspecialchars」相匹配,如果你將用戶文本放在HTML屬性值中,你必須注意第二個參數),但基本上它就是這樣。 – Jon 2012-03-04 13:32:53

回答

1

PHP標籤由<??>,也許<%%>一些年齡大的裝置包圍,所以去除PHP標籤可以通過正則表達式進行管理:

$cleaned=preg_replace('/\<\?.*?\?\>/', '', $dirty); 
$cleaned=preg_replace('/\<\%.*?\%\>/', '', $cleaned); 

接下來你把HTML的護理標籤:這些被<>包圍。同樣你可以做到這一點與正則表達式

$cleaned=preg_replace('/\<.*?\>/','',$cleaned); 

這將改變

$dirty="blah blah blah <?php echo $this; ?> foo foo foo <some> html <tag> and <another /> bar bar"; 

$cleaned="blah blah blah foo foo foo html and bar bar"; 
+0

謝謝你,我認爲trim()函數會照顧輸出時的空白處? – 2012-03-04 13:40:35

+0

我沒有觸及'trim()'有一個原因:假設你想要(就像在SO中)一樣,以空白開頭的行有特殊含義(現在或將來的版本),你可能根本不想修剪。只有你有足夠的信息才能平衡對修整與當前或未來問題的需求。 – 2012-03-04 13:47:28

+0

謝謝你,我不需要像你說的那樣使用trim功能。我現在將學習preg_replace的語法,並嘗試通過加粗等方式輸出文本環繞的星號。 謝謝 – 2012-03-04 14:02:14

1

你可以嘗試使用正則表達式來剝去標籤,如:

preg_replace("/\<(.+?)\>/", '', $str); 

不知道這就是你要找的東西,但它會刪除<和>中的任何東西。您還可以通過要求<之後的第一個字符成爲一個字母來使它更安全一些。

+0

謝謝你,這有幫助! – 2012-03-04 14:11:48

1

正確的方法是不刪除用戶的評論的HTML標籤,而是告訴瀏覽器認爲以下文本不應該被解釋爲HTML,Javascript,不管。想象一下,有人想發佈像我們這裏在stackoverflow上的示例代碼。如果你只是直截了當地刪除似乎是代碼的評論的任何部分,你會弄亂用戶的評論。

解決方案是使用htmlentities,它將在註釋中轉義用於html標記的符號,以便它實際上顯示爲瀏覽器中的文本。

例如,瀏覽器將解釋爲<作爲html標記的開始。如果您只想讓瀏覽器顯示<,則必須在源代碼中編寫&lt;htmlentities會將所有相關的符號轉換爲你的html實體。

長一點的示例

echo htmlentities("<b>this text should not be bold</b><?php echo PHP_SELF;?>"); 

輸出

&lt;b&gt;this text should not be bold&lt;/b&gt;&lt;?php echo PHP_SELF;?&gt; 

瀏覽器將輸出

<b>this text should not be bold</b><?php echo PHP_SELF;?> 

考慮與下述溶液現實生活中的例子,你接受。想象一下,用戶寫這篇評論。

i'm in a bad mood today :<. but your blog made me really happy :> 

現在會做的文字你preg_replace("/\<(.+?)\>/", '', $comment);,它會刪除一半的評論:

i'm in a bad mood today : 

如果這是你想要的東西,別提這個答案。如果你不這樣做,請使用htmlentities

如果要將註釋另存爲文件,而不是讓服務器在其中解釋PHP代碼,請使用擴展名(如「.html」或「.txt」)保存,以便Web服務器不會調用首先是PHP解釋器。通常不需要轉義PHP代碼。

+0

感謝您的意見,但評論系統並沒有真正需要用戶提交代碼片段,它僅僅是評論其他用戶上傳和圖像或對網站相關新聞的評論。謝謝! – 2012-03-04 13:39:55

+0

這不是問題。即使用戶不發佈HTML代碼或任何代碼,他們仍然使用符號,瀏覽器解釋爲html代碼。您通常不想刪除這些符號,因爲它們在評論中可能有不同的含義。如果您只是盲目地刪除這些符號,您最終可能會刪除部分笑臉或數學方程或URL。這真的會搞亂評論。逃避是要走的路。您正在向瀏覽器提供HTML代碼。如果您不希望用戶的評論被解釋爲html代碼,請將其轉義。 – Basti 2012-03-04 13:44:27

+0

爲這個問題增加了一些解釋。希望你現在能夠理解這個問題。 – Basti 2012-03-04 14:14:14