2011-12-11 39 views
1

我最近開始在我的「文章輸入」頁面上使用NicEdit。但是,我有一些關於安全性和防止濫用的問題。如何清理NicEdit的HTML POST值?

第一個問題: 我目前在我的數據庫類中用「mysql_real_escape_string()」來清理每個輸入。此外,我使用「htmlspecialchars(htmlentities(strip_tags($ var))」來清理HTML值。

如何在將數據添加到數據庫時清理「HTML輸入」,或者我的工作方式是完美的?

第二個問題: 當我在做這個問題,有一個問題:「類似的標題」所以我readed它曾經這是有人在談論「被濫用的HTML輸入」惹了有效的模板。 (例如,只是輸入)

它也可能出現在我的當前系統上。應該如何處理PHP?

Ps。我想繼續使用NicEdit,所以使用BBCode系統應該是最後的建議。

謝謝。

回答

3
  1. mysql_real_escape_string消毒,它逃脫文本值保持SQL查詢有效/不含糊/注射安全的語法。
  2. strip_tags消毒您的字符串。
  3. 這樣做既htmlentitieshtmlspecialchars爲了矯枉過正而可能只是斷章取義您的數據。既然你在這之前也剝奪了標籤,這是雙重的矯枉過正。
  4. 該規則是爲了確保您的數據不會破壞您的SQL語法,因此您在將數據放入查詢之前先對其進行mysql_real_escape_string一次。你也做同樣的事情,保護您的HTML語法,通過HTML輸出成HTML之前轉義文本,使用要麼htmlspecialchars(推薦)htmlentities不能同時
  5. 欲瞭解更多詳情,請閱讀The Great Escapism (Or: What You Need To Know To Work With Text Within Text)
  6. 我不知道NicEdit,但我認爲它允許您的用戶在幕後使用HTML設置文本樣式。爲什麼要從數據中剝離HTML呢?那麼使用所見即所得的編輯器沒有意義。
+0

我會閱讀文章。我擔心可以將JavaScript代碼寫入HTML的用戶,或將用戶重定向到具有基本HTML重定向的注入(例如病毒鏈接)。他們仍然可以將自己的HTML包含到NicEdit文本區域,爲什麼它應該被信任? – Aristona

+1

的確,但這是允許*選擇性* HTML輸入的一個普遍問題。如果你完全不信任你的用戶,只需HTML就可以逃脫一切。如果你信任你的用戶(比如說,因爲它只有你),只需按原樣使用文本即可。兩者之間的任何事情都是混亂的,IMO最好使用諸如Markdown之類的特殊標記語言來解決問題,該標記語言將轉換爲HTML。選擇性地清理HTML是很複雜的,最好使用像[HTML Purifier](http://htmlpurifier.org/)這樣的庫。 – deceze

0

這是我在我的一個NICEDIT應用程序中使用的函數,它似乎與來自nicedit的代碼很好地結合在一起。

function cleanFromEditor($text) { 

    //try to decode html before we clean it then we submit to database 
    $text = stripslashes(html_entity_decode($text)); 

    //clean out tags that we don't want in the text 
    $text = strip_tags($text,'<p><div><strong><em><ul><ol><li><u><blockquote><br><sub><img><a><h1><h2><h3><span><b>'); 

    //conversion elements 
    $conversion = array(
     '<br>'=>'<br />', 
     '<b>'=>'<strong>', 
     '</b>'=>'</strong>', 
     '<i>'=>'<em>', 
     '</i>'=>'</em>' 
    ); 

    //clean up the old html with new 
    foreach($conversion as $old=>$new){ 
     $text = str_replace($old, $new, $text); 
    } 

    return htmlentities(mysql_real_escape_string($text)); 
} 
+0

看起來不錯,但是,爲什麼你在輸出數據上使用mysql_real_escape_string?這只是爲了防止SQL注入,.. –