对URI的安全AJAX请求


Secure AJAX request to URI

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

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

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

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

控制器是否可以写入数据库:

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

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

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

"导航菜单模块"只能由管理员编辑,因此必须进行身份验证。但是,任何浏览包含该模块的页面的web冲浪者都不应该通过身份验证来使用导航,这将是愚蠢的。

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

另外,这完全取决于您是否允许用户在不登录的情况下更改您的数据库。登录用户更容易验证,你总是可以放在服务器端检查脚本-如果当前用户被允许做这个操作。

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

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