JSON 安全最佳实践?

2024-05-06

在研究这个问题的同时JSON 与 XML http://www.subbu.org/blog/2006/08/json-vs-xml, 我碰到这个问题 https://stackoverflow.com/questions/325085/when-to-prefer-json-over-xml。现在,更喜欢 JSON 的原因之一被列为 Javascript 中易于转换的原因之一,即eval()。现在我立即意识到,从安全角度来看,这可能存在问题。

因此,我开始对 JSON 的安全方面进行一些研究,并通过这篇博文了解如何JSON 并不像人们想象的那么安全 http://incompleteness.me/blog/2007/03/05/json-is-not-as-safe-as-people-think-it-is/。这部分突出了:

Update:如果你 100% 执行 JSON 正确的话,那么你只会有 顶层的对象。数组, 字符串、数字等都将是 包裹。 JSON 对象将会失败 eval() 因为 JavaScript 解释器会认为它正在看 一个块而不是一个对象。这 对预防有很大帮助 这些攻击,但它仍然是最好的 保护您的安全数据 不可预测的 URL。

好的,这是一个很好的开始规则:顶层的 JSON 对象应该始终是对象,而不是数组、数字或字符串。对我来说听起来是个好规则。

当涉及到 JSON 和 AJAX 相关的安全性时,还有其他需要做或避免的事情吗?

上面引用的最后一部分提到了不可预测的 URL。有谁有更多这方面的信息,特别是你如何在 PHP 中做到这一点?我在 Java 方面的经验比 PHP 丰富得多,而且在 Java 方面这很容易(因为您可以将整个范围的 URL 映射到单个 servlet),而我所做的所有 PHP 都将单个 URL 映射到 PHP 脚本。

另外,究竟如何使用不可预测的 URL 来提高安全性?


针对 JSON 的安全攻击有很多,尤其是 XSRF。

当 Web 服务使用 cookie 进行身份验证,并使用包含敏感数据的 JSON 数组响应 GET 请求时,就会出现该漏洞。

如果攻击者可以欺骗登录到服务 naive-webapp.com 的用户访问他们的网站(或任何嵌入他们控制的 IFRAME 的网站,例如通过嵌入式广告),那么他们可以插入<script>使用 SRC 标记到 naive-webapp.com,并可能窃取用户的数据。 这取决于 JavaScript 的 javascript 怪癖Array像这样的构造函数:

 <script>
   // Overload the Array constructor so we can intercept data
   var stolenArrays = [];
   var RealArray = Array;
   Array = function () {
     var arr = RealArray.apply(arguments);
     stolenArrays.push(arr);
     return arr;
   }
 </script>
 <!-- even though the attacker can't access the cookies,
   - he can cause the browser to send them to naive-webapp.com -->
 <script src="//naive-webapp.com/..."></script>
 <script>
   // now stolenArrays contains any data from the parsed JSON
 </script>

EcmaScript 5 修复了导致的令人困惑的行为[]去查查看Array在全局对象上,许多现代浏览器不再容易受到这种攻击。

顺便说一句,Oil 关于不可预测的 URL 的说法是错误的。 URL 中的加密安全随机标识符是保护资源的好方法。基于身份的安全并不是石油所暗示的万能药。 看http://waterken.sourceforge.net/ http://waterken.sourceforge.net/例如,基于 URL 中的加密安全标识符的安全分布式应用程序方案,不需要身份概念。

EDIT:

在考虑 JSON 与 XML 时,您还应该了解 XML 特定的攻击媒介。

XXE http://projects.webappsec.org/w/page/13247003/XML%20External%20Entities、XML 外部实体攻击,利用精心设计的 XML 穿过防火墙访问文件系统和网络资源。

<!DOCTYPE root 
[
<!ENTITY foo SYSTEM "file:///c:/winnt/win.ini">
]>
...
<in>&foo;</in>

应用程序将输入(参数“in”,其中包含 win.ini 文件)嵌入到 Web 服务响应中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSON 安全最佳实践? 的相关文章

  • Sonar 中的 javascript 代码覆盖率

    我是使用 Sonar 和插件进行 javascript 代码覆盖的新手 使用 Sonar 分析时 有哪些可能性可以找出 javascript 代码的质量 包括代码覆盖率 目前我正在使用 karma runner 它提供代码覆盖率报告 可以在
  • 如何强制折断不可折断的字符串?

    我有一个根据数据库中包含的数据生成的 HTML 页面 数据库有时包含浏览器无法分解的长字符串 因为这些字符串不包含可分解的字符 空格 点 逗号等 有没有办法使用 html css 甚至 javascript 来解决这个问题 看到这个link
  • 在多个动态添加的表单上初始化 jQuery validate() 函数

    有人建议最好初始化一个 form validate 在页面加载而不是点击事件上运行 jquery form validate 插件仅允许在输入更改时提交 https stackoverflow com questions 10984196
  • 在 setInterval / setTimeout 中使用变量作为时间[重复]

    这个问题在这里已经有答案了 这是一个示例情况 var count time 1000 setInterval function count 1 time 上面的代码会将 count 变量加 1 即 1000 毫秒 看来 setInterva
  • JavaScript:常量属性

    在javascript中 我可以将对象的属性声明为常量吗 这是一个示例对象 var XU Cc Components classes or function aXU this Cc Components classes var XU new
  • 避免在 ES6 的函数内定位 this 的对象作用域

    例如 我正在使用 D3 js 运行一个项目 导入特定模块并调用它们的函数 Setup TypeScript ES6 导入特定的 D3 组件 角6 我有一个对象 在本例中是一个角度指令 并在 SVG 画布上绘制一些圆圈 并希望它们在拖动事件上
  • 窗口大小调整触发的 DOM 事件

    我有一个布局相当复杂的页面 最初打开页面时 某些元素的对齐存在问题 但是 可以通过更改浏览器窗口的大小来 永久 解决此问题 显然 我不希望用户必须调整浏览器窗口的大小才能使页面正确显示 所以我想知道是否有一种方法可以在页面首次加载时以编程方
  • jQuery / Ajax:如何循环遍历数组作为 Ajax 成功函数的一部分

    我有一个阿贾克斯调用返回一个数组并需要对该数组中的每个值执行某些操作 到目前为止 我有以下内容 但这会返回以下错误 Uncaught TypeError Cannot use in operator to search for length
  • 有没有办法伪造同步 XHR 请求?

    我正在使用 Emscripten 系统将一堆 C 代码移植到 Javascript C 代码有很多调用fopen这是一个同步 IO 调用 在 Emscripten 中 我们使用对本地资源的 XHR 请求来模拟这一点however 在 Fir
  • 为什么 Array.prototype.filter() 在 Magnolia JavaScript 模型中抛出错误?

    我正在尝试过滤 FreeMarker 列表Magnolia JavaScript 模型 https documentation magnolia cms com display DOCS61 How to work with JavaScr
  • JavaScript Promise 不执行 .then()

    我在 JavaScript 中的 Promise 方面遇到了一些问题 我想做的是获得一个地址列表 然后对于每个地址 我需要调用地理编码 API 来获取 lat lng 然后我将继续将标记与热图一起绘制 这是我的代码 let promiseK
  • 将 JSON 参数从 java 发布到 sinatra 服务

    我有一个 Android 应用程序发布到我的 sinatra 服务 早些时候 我无法读取 sinatra 服务上的参数 但是 在我将内容类型设置为 x www form urlencoded 之后 我能够看到参数 但不完全是我想要的 我在
  • JavaScript 中的实时摩尔斯电码转换器

    在看到谷歌关于莫尔斯电码 gmail 的愚人节笑话后 我想我应该尝试用 javascript 创建一个实时莫尔斯电码转换器 我正在使用正则表达式和替换将莫尔斯电码更改为字符 例如 replace g a replace g r 我遇到的问题
  • Aurelia - 仅 HTML 自定义元素的内联定义

    我的 Aurelia 视图模型中有一个递归对象 如下所示 Class BottomlessPit Name string MorePits BottomlessPit null 因此 我想在 Aurelia 视图中使用递归模板 它只会在一个
  • Outlook 加载项,无法读取未定义的属性“BeginRequestEventArgs”

    我使用 Visual Studio 开发了 Outlook 插件 我的插件有一个按钮 用于填充会议邀请正文中的详细信息并添加所需的与会者 这在 99 的情况下都有效 但是 时不时地它会给我下面的 JavaScript 错误 Uncaught
  • Django 将 JSON 数据传递给静态 getJSON/Javascript

    我正在尝试从 models py 中获取数据并将其序列化为views py 中的 JSON 对象 模型 py class Platform models Model platformtype models CharField max len
  • 搜索多维数组 JavaScript

    我有一个如下所示的数组 selected products 0 r1 7up 61 Albertsons selected products 1 r3 Arrowhead 78 Arrowhead selected products 2 r
  • 如何通过 ajax 加载页面后显示 Twitter / Facebook / Google+ 按钮?

    我有一个 Rails 3 1 应用程序 我希望允许用户通过 Twitter Google 和 Facebook HTML5 版本的 Like 按钮 共享项目 我让它在项目的显示页面上工作得很好 即 仅显示该项目 但我在通过 Ajax 加载列
  • 用javascript调用外部网页(跨域)

    我正在尝试使用以下网络服务来验证提要这个问题 https stackoverflow com questions 11996430 check if a url is a valid feed 但浏览器不允许我向另一台服务器发送 ajax
  • JQuery 删除和内存泄漏

    我正在开发一个游戏 我看到了很多内存消耗 我使用jquery animate 动画完成后 我 remove 元素 我的问题是 从 dom 树中删除一个元素后 对象还存在记忆中吗 Javascript 是一种垃圾收集语言 这意味着当没有代码保

随机推荐

  • SecurityApplicationGroupIdentifier 的应用程序组返回 nil

    我设置了一个应用程序组与我的 Today Extension 一起使用 我在主应用程序的目标和扩展程序的目标中添加了应用程序组 在开发人员门户的应用程序 ID 配置中 我启用了应用程序组 但由于某种原因FileManager default
  • 在 IEnumerable 上使用 Seq 函数 [重复]

    这个问题在这里已经有答案了 我正在尝试在 IEnumerable 上应用 Seq 函数 更具体地说 它是System Windows Forms HtmlElementCollection它实现了ICollection and IEnume
  • 加速度计和校准 - iPhone SDK

    我需要在 iPhone 游戏中使用加速计的功能 我只需通过倾斜设备来移动图像即可 然而 YouTube 上的大多数视频仅显示以某种方式反转的倾斜功能 而忘记包含校准 我希望用户将他们的设备校准到他们所处的任何位置 有谁知道我应该如何开始 我
  • 如何编写简单的运动跟踪代码?

    我正在制作一个带有伺服系统和彩弹枪的哨兵炮塔 需要实现实时运动跟踪以使枪射击任何移动的东西 我该如何编码 任何好的算法 书籍 教程 我想自己制作而不是使用预制的解决方案 带有卡尔曼滤波的 Lucas Kanade 是最基本的运动跟踪算法 然
  • 如何在 Vue 中动态创建的组件上获取更新的 $refs?

    我的组件数量取决于数组数量 因此当我向数组添加新项目时 它应该创建新组件 当创建新组件时 我想获得它的参考 这就是我有误解的地方 最后添加的组件是undefined当我试图得到它时 但是 如果我在一段时间后尝试获取参考 它就会起作用 我猜这
  • 添加动态复选框处理 CheckedChanged 事件 ASP.NET

    我想知道为什么事件没有触发以及如何找到哪个复选框控件触发了事件 chkList1 new CheckBox chkList1 Text row subj nme ToString chkList1 ID row subjid ToStrin
  • 如何在android中向服务器发送数据[重复]

    这个问题在这里已经有答案了 我想在我的应用程序中循环发送纬度和经度 这是使用 GPS 获取此参数的函数 private void showLocation Location location String latitude Latitude
  • C# 中的异常转换

    为什么我会得到一个InvalidCastException当尝试这样做时 throw ArgumentNullException new Exception errormessage null 这是以下函数的简化版本 public stat
  • 如何删除字符串中的所有前导零

    如果我有一个字符串 00020300504 00000234892839 000239074 我怎样才能去掉前导零 这样我就只有这个 20300504 234892839 239074 请注意 上面的数字是随机生成的 ltrim http
  • 为什么 VectorBuilder 位于 scala.collections.immutable 包中?

    VectorBuilder在同一源文件中定义为Vector Vector是不可变的并且在scala collections immutable包 因此构建器位于同一个包中 据我所知 CanBuildFrom uses a VectorBui
  • 在 C++ 中将 64 位值左移 64 位给出奇怪的结果[重复]

    这个问题在这里已经有答案了 可能的重复 64位移位问题 https stackoverflow com questions 1024968 64bit shift problem 我在 Windows 8 64 位上使用 Visual St
  • 按需require()

    假设我创建了一个库 libname其中包含一个主文件 main js以及偶尔与主对象一起使用的多个可选库文件 a js and b js 我创造index js文件包含以下内容 exports MainClass require main
  • 在 SQL 中,如何获取特定列中具有最大值的行?

    我有一个疑问 SELECT COUNT as votes a member id FROM ballots a WHERE ballot id 1 GROUP BY a member id 这会产生类似的结果 votes member id
  • void abort() 的声明抛出不同的异常

    我正在尝试写一些C 代码 使用 C API Festival并且在尝试编译时陷入困境 这是我调用的方式g g Wall pedantic I I speech tools include helloFestival C o h L fest
  • jQuery 获取属性

    我有一个 uid 属性 它的值在我的 body 标签上 document ready regFunct function regFunct alert body attr uid 但它说 未定义 有事吗 try document ready
  • 删除单元格中的重复条目 - R

    我在这里到处搜索 并尝试了重复和独特的功能来解决我要问的问题 但没有任何效果 假设我有一个名为 company 的数据框 其状态可变 当我折叠行时 我在状态变量观察之一中留下以下输出 PA PA PA TX TX 我怎样才能删除单元格内的重
  • 如何将 Ajax() 中的值获取到 Django 模板中?

    我有一个 Django 模板 它显示从数据库接收的多个值并将其传递给模板 如下所示 在views py中 def test1 requests requests get requests get requests get someQuery
  • preg_replace 内的 preg_replace

    现在我在替换已经从 preg match 中出来的字符串时遇到问题 假设我有 bbcode b bla b 我有这部分正在替换 b with b 但我们只是说出于所有测试目的 他们所做的 b hi b test b b 最终出来的是 hi
  • 如何在JavaFX 2应用程序中正确使用Weld?

    我正在尝试让 Weld 在我的 JavaFX 2 SE 应用程序中工作 或者我应该说 JavaFX 在 Weld 中工作 我有响应用户交互的控制器 现在我想将我的服务 例如数据库服务 注入到这些控制器中 使用 Weld 这应该像以下一样简单
  • JSON 安全最佳实践?

    在研究这个问题的同时JSON 与 XML http www subbu org blog 2006 08 json vs xml 我碰到这个问题 https stackoverflow com questions 325085 when t