代码之家  ›  专栏  ›  技术社区  ›  EZDM

避免在上使用XSS。使用JQUERY获取JSON

  •  0
  • EZDM  · 技术社区  · 6 年前

    我需要从JSON中提取数据。我可以这样做:

    $.getJSON(MACHINE + '/DailyFoundServlet?csfin=' + sDateFoundArray [i][CODE] + '&found=1&pubblic=true&callback=?', function(data) {
    
            sDateFoundArray [i][FOUND]=data;
            sDateFoundArray [i][NSER]++;
    
        })
    

    1 回复  |  直到 6 年前
        1
  •  0
  •   Community Egal    4 年前

    我开始怀疑你必须使用JSONP。没有方法保护回调,它基本上是注入一个 <script> 并执行代码。仅供参考: jQuery JSONP Security

    我将从以下内容开始:

    jsonp的工作方式和 <Script src='whatever'> </script>

    现在,运用你的想象力,陷阱是什么。

    考虑一下,它基本上与您的 .getJSON() :

    $.ajax({
      url: MACHINE + "/DailyFoundServlet",
      dataType: "jsonp",
      data: {
        'csfin': sDateFoundArray [i][CODE],
        'found': 1,
        'public': true
      },
      jsonp: "callback",
      sucess: function(data) {
        sDateFoundArray [i][FOUND]=data;
        sDateFoundArray [i][NSER]++;
      }
    });
    

    pubblic=true 我不确定这是打字错误还是故意的。我以为是打字错误。上述代码仍然易受XSS攻击。

    正如我提到的,如果可以的话,我建议使用POST作为一种更安全的选择。这看起来像:

    $.ajax({
      url: MACHINE + "/DailyFoundServlet",
      dataType: "json",
      data: {
        'csfin': sDateFoundArray [i][CODE],
        'found': 1,
        'public': true
      },
      method: "post",
      sucess: function(data) {
        sDateFoundArray [i][FOUND]=data;
        sDateFoundArray [i][NSER]++;
      }
    });
    

    这段代码处理返回的数据,需要JSON数据。如果有人试图发回其他数据,如脚本块,它将不会被解释,函数将失败。最好检查一下 data 对于 length

      sucess: function(data) {
        if(data.length != 0){
          sDateFoundArray [i][FOUND]=data;
          sDateFoundArray [i][NSER]++;
        }
      }