为什么jQuery .val()不编码&到&

时间:2016-11-04 11:03:37

标签: jquery

<input type="text" id="search" value=" &amp; ">

加载页面输入时会显示&amp; (那很好)

但是如果我使用jQuery来更新输入的值,那就说:

$("#search").val(" &amp; ");输入会显示&amp;(但我想在后面显示&amp;(但仍然编码为&amp;,就像第一个例子一样))

我在这里缺少什么?

1 个答案:

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

Source

但无论何时需要保护,您都需要在服务器端拥有一个保护。您可以保护您的客户端以及XSS输入,但这是可选的。