【问题标题】:How to properly use htmlentities() and deal with XSS while still allowing quotes如何在允许引号的同时正确使用 htmlentities() 并处理 XSS
【发布时间】:2013-10-03 17:17:24
【问题描述】:

好的,我有一个创建新记录的表单。该表单包含几个文本字段。在将它们放入数据库之前,我通过 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 Ou0039;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" />

框内显示“猫”字样。

如果用户输入 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());
          });

【问题讨论】:

  • html_entity_decode() 显示由htmlentities()编码的数据时
  • 是的,但这会使我的网站容易受到攻击,因为用户可以输入以下内容:John O" onmouseover="alert(3);" data-dummy="Conner
  • @BOSS 对不起上面针对你
  • 答案已更新,请查看
  • 你在哪里有问题,在存储到数据库或只显示在输入字段框中,通过使用我在回答中给出的方法太安全了

标签: javascript php html xss html-entities


【解决方案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);

插入数据之前

【讨论】:

  • 正如我在评论中所说的那样,是的,但这会使我的网站存在漏洞,因为用户可以输入以下内容:John O" onmouseover="alert(3);" data-dummy="Conner .这意味着
猜你喜欢
  • 2010-09-11
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
  • 2013-06-23
  • 2014-03-12
  • 2018-07-07
  • 2015-12-02
  • 1970-01-01
相关资源
最近更新 更多