本文共 739 字,大约阅读时间需要 2 分钟。
CSRF是说攻击者可以利用别人的权限去执行网站上的操作,例如删除资料。例如,攻击者张贴了以下脚本到网页上:
攻击者自己当然是没有权限可以执行”/posts/delete_all”这一页,但是网站管理员有。当网站管理员看到这一页时,浏览器就触发了这个不预期的动作而把资料删除。
要防范CSRF,首先可以从区别GET和POST的HTTP请求开始。我们在路由一章提过:所有读取、查询性质操作,都应该用GET,而会修改或删除到资料的,则要用POST、PATCH/PUT或DELETE。这样的设计,就可以防止上面的恶意程式码了,因为在浏览器中必须用表单form才能送出POST请求。 不过,这样还不够。因为即使是POST,浏览器还是可能不经过你同意而自动发送出去,例如:To the harmless survey
所幸,Rails内建了CSRF防御功能,也就是所有的POST请求,都必须加上一个安全验证码。在app/controllers/application_controller.rb你会看到以下程式启用这个功能:
class ApplicationController < ActionController::Base protect_from_forgery with: :exceptionend
这个功能会在所有的表单中自动插入安全验证码:
如果POST请求没有带正确的验证码,Rails就会丢出一个ActionController:InvalidAuthenticityToken的错误。
Layout中也有一段<%= csrf_meta_tags %>是给JavaScript读取验证码用的。转载地址:http://srasn.baihongyu.com/