如何正确使用htmlentities()并处理XSS,同时仍然允许引号

时间:2013-10-03 17:17:24

标签: javascript php html xss html-entities

好的,我有一个表单来创建新记录。表单包含几个文本字段。在将它们放入数据库之前,我通过htmlentities运行字段($ field,ENT_QUOTES)。那很棒。我不可能容易受到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>

这不是很好也很好,因为该领域显示为“John O&amp;#uner; Conner”。如果我允许引号,那么人们可以突破我的输入字段并注入XSS。

如果我能避免某些事情,我真的不想将某些事情列入白名单。

就像在SO上一样。当我编辑帖子时,引号和任何随机文本仍然在框中,但是SO对XSS免疫。

字段由AJAX请求填充,该请求返回所有字段的JSON数据。

编辑:

BOSS,你错过了这一点。我想要输入字段。我只想让VALUES正确显示。

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

如果用户输入“cat”,则输入字段变为:

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

并在框中显示“cat”字样。

如果用户输入John O'Conner,则输入字段变为:

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

并且框中显示“John O'Conner”字样(不好)。

如果我允许引号,用户可以放入'John“onmouseover =”alert(3);“data-dummy =”Conner“,输入字段将变为:

  <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());
          });

1 个答案:

答案 0 :(得分:1)

使用此功能在插入数据库之前清理数据

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

strip_tags() -删除标签

PHP Doc

  

html_entity_decode()与htmlentities()相反   将字符串中的所有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);

插入数据之前