在PHP中处理CSRF攻击一般有以下三种常见方法:
- 隐藏表单域和Referer
在表单中设置一个隐藏域,值为随机生成的token,并且在表单提交到后台时,同时提交当前页面的Referer值。在后台处理表单时,先判断当前页面的Referer值是否和请求头中的Referer值一致,然后再检查提交的token值是否和之前设置的一致。如果不一样,则认为是CSRF攻击。
- Session验证
在表单提交前,在服务器端生成一个session,并将session ID存储到一个隐藏域里。在表单提交时,验证session ID和提交的session ID是否一致。如果不一致,则认为是CSRF攻击。
- CSRF防护工具
可以使用PHP中现成的一个类库CSRF防护工具,例如,Laravel中提供了CSRF中间件,在后台处理表单时,会自动检查表单提交的token值是否和session中存储的token值一致。如果不一致,则认为是CSRF攻击。
需要注意的是,以上任何一种方法都不能100%防止CSRF攻击,因此建议采用多种方法组合使用,以提高防护能力。