好的,我有一个表单来创建新记录。表单包含几个文本字段。在将它们放入数据库之前,我通过htmlentities运行字段($ field,ENT_QUOTES)。那很棒。我不可能容易受到XSS的攻击,因为没有人能够突破我的领域。
例如:
Assume the user entered 'Lol <script></script>'
<div>
<div>Description</div>
<div>Lol <script></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());
});
答案 0 :(得分:1)
使用此功能在插入数据库之前清理数据
function sanitize($data){
$data= htmlentities(strip_tags(trim($data)));
return $data;
}
strip_tags() -
删除标签
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);
插入数据之前