<input type="text" id="search" value=" & ">
加载页面输入时会显示&amp; (那很好)
但是如果我使用jQuery来更新输入的值,那就说:
$("#search").val(" & ");
输入会显示&
(但我想在后面显示&amp;(但仍然编码为&
,就像第一个例子一样))
我在这里缺少什么?
答案 0 :(得分:1)
您无法仅通过在浏览器中防止有害用户编码来保护自己免受XSS攻击。即使没有浏览器,我也可以向您发送有害请求。在存储用户数据或生成html时,您需要保护自己免受服务器端的XSS攻击,具体取决于您的方法。
这是一个PHP函数,您可以使用它来保护自己免受此类攻击:
public static function protectArrayAgainstXSS(&$arr) {
$changed = false;
foreach ($arr as $index => $a) {
if (is_array($a)) {
$changed = $changed || Common::protectArrayAgainstXSS($arr[$index]);
} else if ($a !== null) {
$changed = $changed || ($arr[$index] === strip_tags($a));
$arr[$index] = strip_tags($a);
}
}
return !$changed;
}
只要希望保证生成的HTML是安全的,您的代码就应该运行。
关于你关于jQuery的问题:.val()
不应该处理你想要的东西。如果你想对事物进行编码 - 解码,你可以这样做:
function htmlEncode(value){
//create a in-memory div, set it's inner text(which jQuery automatically encodes)
//then grab the encoded contents back out. The div never exists on the page.
return $('<div/>').text(value).html();
}
function htmlDecode(value){
return $('<div/>').html(value).text();
}
function myVal(context, v) {
return v ? context.val(htmlEncode(v)) : htmlDecode(context.val());
}
但无论何时需要保护,您都需要在服务器端拥有一个保护。您可以保护您的客户端以及XSS输入,但这是可选的。