客户刚登录你网站,Cookie还在。他不小心点了一个陌生链接,打开了另一个网站。那个网站的页面里偷偷写了一段代码,自动以客户的身份请求你网站的接口:发评论、改资料、甚至下单。客户自己都不知道发生了什么。这就是CSRF跨站请求伪造。
怎么防
第一,表单加Token。免费CMS在生成表单的时候,自动在表单里加一个隐藏的Token字段。这个Token跟当前客户绑定。客户提交表单的时候,服务器验证Token对不对。其他网站伪造请求的时候拿不到这个Token,直接拒绝。
主流CMS(WordPress、Drupal等)默认都有CSRF Token。你不用自己写。
第二,敏感操作要重新登录。改密码、绑定邮箱、删除账号这种操作,要求客户重新输入密码。光有Cookie不够。
第三,改资料用POST不用GET。别把修改信息的接口做成GET请求(?action=delete&id=1)。用POST,并且带Token。
第四,Cookie设置SameSite属性。在Nginx或者CMS配置里,Cookie加上SameSite=Lax。这样跨站请求的时候浏览器不会带你的Cookie,CSRF直接失效。
小站要不要担心CSRF
如果你网站有用户登录、有在线支付、有客户个人资料,那要防。前面讲的主流CMS默认防护都有,你不用折腾。
如果你网站只是展示文章,没有用户系统,客户不用登录就能看,那CSRF基本跟你没关系。别过度防护把自己绕进去。


