以这种方式使用 ajax 有多安全


How safe is it to use ajax this way?

我有一个项目,用户有自己的用户页面,该页面由可编辑的块组成(它们可以移动并且可以更改其内容)。这些块的内容(目前主要是文本)等存储在mysql数据库中。整个编辑由我的page-editing.js脚本完成。用户保存他所做的更改后page-editing.jssave-page.php发送ajax post调用(数据是块对象,用户名和页面名称的数组),将接收到的数据插入mysql数据库。

我的问题是:

我怎样才能防止"不适当"地向我的save-page.php发布呼叫,因为据我所知,任何人都可以向它发送呼叫。如果我save-page.php检查登录会话是否已启动会话中具有正确的用户名,这是否足够?

安全吗? 好吧,如果您保护该端点,就会如此。

有许多方法可以提供安全性,但我建议以下两种选择。

1)基于会话。对用户进行身份验证,然后在内置的 PHP 会话中设置标志。 检查终结点中的该标志,并在请求未通过身份验证时执行适当的错误处理。

2)无国籍。 使用安全的 Cookie 协议实现对请求进行签名和身份验证。
协议在这里: http://www.cse.msu.edu/~alexliu/publications/Cookie/cookie.pdf并且有各种实现。 以下是有关该主题的众多博客文章之一:http://raza.narfum.org/post/1/user-authentication-with-a-secure-cookie-protocol-in-php/

前者会让你最快地滚动,可能是你应该做的。 后者是您在寻求扩展时可以进行的优化,因为会话会在水平架构上产生麻烦。

无论如何,请注意

如何存储任何密码(散列它们,加盐它们),并且使用https当然可以防止用户信息被明文发送。

if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
    ... it's an AJAX request so do something ...
}
else {
    ... it's not an AJAX request so do something else ...
}

但最好的方法是会话检查。因为这可能是欺骗的,你的 GET/POST 变量也可以。