0

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

1 回答 1

1

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

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

strip_tags() -删除标签

PHP文档

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

我正在从我的其他答案中选择这部分阅读此问题 安全方式

$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);

在插入数据之前

于 2013-10-03T17:35:53.953 回答