原理
csrf_token生成
csrf_token:mask + cipher
mask:32位字母数字组合,随机生成。
cipher:32位字母数字组合,由csrf_secret生成。
通过随机生成一个32位的字母数字组合作为csrf_secret,然后通过随机的mask加上cipher(处理后的csrf_secret)生成cookie中的csrftoken和表单中的csrftoken。cookie中的csrf会长时间保留(有效期1年),每次表单中的的csrftoken都是根据它生成。
从上图可以看到首次访问时生成的cookie中的csrf_token的值和有效期。
csrf_token验证
由于cookie中的csrftoken和表单中的csrftoken由相同的csrf_secret生成,所以解密后如果两者的csrf_secret相同,则说明是正常的请求,通过验证。
加密
cipher_index = mask_index + secret_index
解密
secret_index = cipher_index - mask_index
更多处理细节请参考:django/middleware/csrf.py