【问题标题】:Secure AJAX request to URI对 URI 的安全 AJAX 请求
【发布时间】:2013-04-09 02:20:47
【问题描述】:

我知道有很多关于 AJAX 安全性的问题。我已经搜索并阅读过,但仍然不清楚最好的方法是什么。

我有一个非常具体的场景:

我有一个构建在 PHP MVC 框架之上的应用程序。我已经将诸如“导航菜单”之类的演示元素模块化。导航菜单模块有一个控制器(服务器端)。控制器使用模型从数据库中检索数据,然后以 php 回显数据进行响应。我可以使用 AJAX 向控制器发出 http 请求,因为控制器是通过 URI 路由到的。我相信这被称为 RESTful API。当用户单击导航菜单中的链接时,静态内容区域会使用从 AJAX 请求中检索到的数据进行更新。假设我在能够将数据写入数据库的同一控制器中进行了不同的操作。拥有一个允许写入数据库的公开 URI 显然很糟糕。如何保护 URI 接口,以便 AJAX 可以检索和写入数据,但那些有恶意的人可能会造成伤害?

【问题讨论】:

  • “我知道有很多关于 AJAX 安全的问题。” ---而且它们都没有任何意义。在 AJAX 中 没有什么(说真的,没有什么特别的)——它是一个常规的 HTTP 请求

标签: php ajax security restful-url


【解决方案1】:

您必须像对待 get 请求或 post 请求一样对待 ajax 请求。 换句话说,永远不要相信用户。您有服务器端控制,ajax 是客户端,所以永远不要相信发出请求的“客户端”(检查数据,如果数据正常则返回响应,如果不返回另一个响应)。

【讨论】:

    【解决方案2】:

    控制器能够写入数据库:

    没有真正的方法来保护公共 URI 接口,以便它只能由存在于客户端的应用程序部分访问。然后的想法是不要让界面如此公开,这意味着每个人都无法访问它!如果一个 URI 指向一个“控制器”(MVC 架构),而控制器又可以访问来操作一个关键数据库,那么最好让向控制器发送请求的客户端必须“验证”。无论 http 请求来自 Web 表单还是 Ajax,这个概念都是正确的。通常在使用 https (http + SSL) 传输身份验证凭据之前,以防止“中间人”看到凭据。

    控制器能够从数据库中读取数据:

    发出读取请求时,您可以简单地返回数据,或者如果其敏感数据需要经过身份验证的客户端。

    “导航菜单模块”只能由管理员编辑,因此必须进行身份验证。但是,浏览包含该模块的页面的任何网络冲浪者都不需要进行身份验证即可使用导航,这很愚蠢。

    【讨论】:

      【解决方案3】:

      主要规则是验证所有输入 - 检查所有传入的数据并清除不需要的字符。

      此外,这完全取决于您是否允许用户在不登录的情况下更改您的数据库。登录的用户更容易验证,如果允许当前用户执行此操作,您始终可以放置服务器端检查脚本。

      当您允许匿名用户写入您的数据库时,事情会变得更加困难。然后,主要对 ID 进行操作是很好的,如果您允许用户从输入中插入数据 - 过滤掉所有不需要的东西。这样做的好方法是创建您批准的字符白名单并删除其他所有内容。

      你必须记住,Ajax 只不过是向 url 发送 POST 请求——你应该做与标准表单相同的保护。另一个好的做法是向您的发送数据添加一个令牌 - 您可以通过服务器端进行验证。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-11
        • 2019-11-21
        相关资源
        最近更新 更多