2013-10-03 26 views
0

好吧我有一個表單來創建一條新記錄。表單需要幾個文本字段。在將它們放入數據庫之前,我通過htmlentities($ field,ENT_QUOTES)運行這些字段。那很棒。我沒有辦法容忍XSS,因爲沒有人可以有希望擺脫我的領域。如何正確使用htmlentities()並處理XSS同時仍然允許引號

例如:

Assume the user entered 'Lol <script></script>' 

<div> 
    <div>Description</div> 
    <div>Lol &lt;script&gt;&lt;/script%gt</div> 
</div> 

那當然好。文本顯示很適合用戶。下面的問題棱

Assume the user entered "John O'Conner" 

<div> 
    <div>Name</div> 
    <div><input name="name" value="John O&#u0039;Conner"</div> 
</div> 

這不是好主意,因爲該領域litteraly顯示爲「約翰·&#u0039;康納」。如果我允許引用,那麼人們可以跳出我的輸入字段並注入XSS。

如果我可以避免的話,我並不想真正將某些事情列入白名單。

就像在SO上一樣。當我編輯帖子時,引號和任何隨機文本仍在框中,但SO對XSS不起作用。

這些字段由一個AJAX請求填充,該AJAX請求返回所有字段的JSON數據。

編輯:

BOSS,你錯過了這一點。我想要輸入字段。我只是想讓VALUES正確顯示。

<input id="name" name="name" value="" /> 
. 
. 
. 
<script> 
    //AJAX request to fill fields here 
</script> 

如果用戶輸入「貓」的輸入字段變爲:

<input id="name" name="name" value="cat" /> 

和被顯示在框中的字「貓」。

如果用戶輸入的約翰·奧康納輸入框變爲:

<input id="name" name="name" value="John O&#u0039;Conner" /> 

,並在「約翰·康納'」顯示在對話框(不好)。

如果我允許引號用戶可以把在「約翰‘的onmouseover =‘警報(3);’數據虛擬=’康納」,並輸入字段將變爲:

<input id="name" name="name" value="John" onmouseover="alert(3);" data-dummy="Conner" /> 

編輯:我落得這樣做:

     var dummy = $("<div></div>"); 
      //Itterate through the JSON object 
      $.each(returned_data, function(key,val) { 
       dummy.html(val) 
       $("#"+key).val(dummy.html()); 
      }); 
+0

'html_entity_decode()'顯示()由'ヶ輛編碼數據時' –

+0

是的,但後來此留下我的網站打開漏洞的用戶可以輸入以下內容:約翰·O「的的onmouseover =‘警報(3);’數據虛擬=」康納 –

+0

上面衝着你 –

回答

1

使用此功能插入數據庫之前淨化你的數據

function sanitize($data){ 
    $data= htmlentities(strip_tags(trim($data))); 
    return $data; 
} 

strip_tags() -刪除標籤

PHP Doc

html_entity_decode()是ヶ輛的()正好相反,它 字符串中的所有HTML實體轉換爲與其適用 字符。

更新:

使用這些最適合你:

<?php  
$str = '<input value="John O" onmouseover="alert(3);" data-dummy="Conner" /> say me'; 
    $search = array('@<script[^>]*?>.*?</script>@si', // Strip out javascript 
        '@<[\/\!]*?[^<>]*?>@si',   // Strip out HTML tags 
        '@<style[^>]*?>.*?</style>@siU', // Strip style tags properly 
        '@<![\s\S]*?--[ \t\n\r]*>@'   // Strip multi-line comments including CDATA 
    ); 
    $str = preg_replace($search, '', $str); 
    echo htmlentities(strip_tags($str)); 
?> 

輸出:

say me 

我採取這一部分從我的其他復讀this question 安全的方式

$name = "Mom's"; 
$db = new PDO('mysql:host=localhost;dbname=databasename', $user, $pass); 
//establish new connection 

$statement = $database->prepare("UPDATE TABLE xyz SET name=?"); 
$statement->execute(array($name)); 

這會更安全本身。你不需要做手動轉義。

或者使用

$msg = mysql_real_escape_string($string); 

插入數據之前

+0

正如把我的意見是,但後來此留下我的網站打開的漏洞爲用戶可以輸入以下命令:約翰·O「的的onmouseover =‘警報(3);’數據虛擬=」康納。這意味着

+0

我編輯了我原來的問題 –

相關問題