执行CRUD操作时,我们可以使用form
来执行它,如下所示:
<form action="/todo/<%= todos[i]._id %>?_method=DELETE" method="POST">
<button>x</button>
</form>
和控制器如下:
app.delete('/todo/:id', (req, res) => {
Todo.findByIdAndDelete(req.params.id, (err) => {
if(err) {
console.log(err);
} else {
res.redirect('/todo');
}
});
});
或者我们可以使用jQuery执行以下操作:
$(document).ready(function(){
$('form').on('submit', function(){
var item = $('form input');
var todo = {item: item.val()};
$.ajax({
type: 'POST',
url: '/todo',
data: todo,
success: function(data){
//do something with the data via front-end framework
location.reload();
}
});
return false;
});
});
两种方法有什么区别? (忽略一个是执行“删除”,另一个是“发布”)有人说后者比前者更安全,但是找不到关于它的文献。
答案 0 :(得分:1)
以下链接是此人简要提及这一点的地方[关于ajax请求更安全],尽管他没有提供任何说明youtu.be/aZ16pkrMkZE?t=875
他完全是在谈论其他事情。通过ajax执行DELETE请求并通过单击简单链接删除应用程序中的对象(这将导致GET请求)。
后者不仅违反约定(GET请求不应更改数据),而且...不是不安全的,而是“危险的”。想象一下,谷歌爬虫访问您的网站并跟随每个链接。吹,所有可删除的对象都消失了。
在某些情况下,它也是不安全的。想象一下,为了创建/更新/删除对象,您需要以某种方式对用户进行身份验证。用身份验证令牌说。由于它是一个普通链接和GET请求,因此令牌必须转到查询字符串。这样,它将公开给所有人查看,缓存在每个缓存代理中,并永久存储在流量日志中。不是很安全。