【问题标题】:Does serializeArray sanitize input before being passed to eval?serializeArray 在传递给 eval 之前是否对输入进行清理?
【发布时间】:2020-09-23 10:09:31
【问题描述】:

出于好奇,因为 eval 是“邪恶的”。序列化数组可以防止 xxs 攻击吗?据我了解,serializeArray() 方法创建了一个 JavaScript 对象数组,准备好被编码为 JSON 字符串。如果是这样,评估数据的更好方法是什么。

var formdata = $('#form').serializeArray();
$.post('https://www.example.com', formdata, function(data) {
    if(data) {
     var buffer = eval('(' + data + ')');
     // do some logic to check for errors
    } else {
      // sumbit the form
    }
});

【问题讨论】:

  • formdatadata 是独立的实体。你只是盲目地评估你从服务器返回的东西,所以不,这里没有保护。
  • 谢谢,这就是我想确认的。在旧代码中发现了这一点,这让我很好奇。

标签: javascript jquery ajax eval serializearray


【解决方案1】:

变量formdata将包含“#form”数据作为一个数组,并将被发布到服务器(example.com)。

服务器将响应一些数据,现在轮到您对数据“执行一些逻辑”了。根据服务器,响应将是字符串、json 或其他数据格式。在这一点上,我很困惑地看到 eval 调用。

eval('(' + data + ')');

这不是您通常处理服务器数据的方式,问题是您是否相信服务器的数据可以清楚地评估它。

说最好只从服务器传递数据并接收它,例如JSON 并检查数据。

库通常会处理 JSON 解析,您可以访问数据并对其进行迭代,就像在 javascript 中迭代对象/数组一样。由于您使用的是 JQuery,我会阅读 $.post 的文档并检查浏览器开发工具中的服务器响应。

【讨论】:

  • eval 调用只是添加了所有错误并将它们显示在引导 toast 消息中。否则它只是提交表单。我在旧代码中发现了这一点,认为这可能很糟糕。
猜你喜欢
  • 1970-01-01
  • 2011-01-03
  • 2011-10-22
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 2011-02-17
相关资源
最近更新 更多