16、csrf

一、csrf跨站请求伪造

旁友!你有听说过钓鱼网站吗?这是一种欺骗用户的虚假网站。
比如说有一个骗子搭建了一个跟银行一模一样的web页面,然后诱导他人进入到骗子这个网站里。受害人误以为这是银行网站,于是乎在该网站给家属转账,结果钱转出去了,受害人家属却没收到钱,你知道这是为什么吗

'''
【原理】
骗子写的form表单中,用户输入的账户、密码都会真实的提交给银行后台,
但是用户输入收款人的账户,是骗子暴露给用户的是一个没有name属性的input框,是假的!
而骗子自己写了一个隐藏的带有name和value的input框,然后把自己的账户填了进去。
用户以为自己给家属的账户转账,实际上是给骗子的账户转账!!!
'''

解决钓鱼网站的策略

'''
只要是用户想要提交post请求的页面,网站在返回给用户的时候就提前设置好一个随机字符串
中间件会给前端加上一个隐藏的input框,里面value就是这个随机字符串
当用户提交post请求的时候,网站会自动先去查找是否有该随机字符串 
如果有,正常提交!如果没有,直接报403错误
'''

所以!!我们之前提交POST总是注释掉一个中间件,那个中间件家属用来校验你有没有这个随机字符串的。
这就是Django自带的东西,可以理解为,这个中间件不允许的前端post请求,都不能通过这一层校验,要怎样让post请求成功呢,就要让他通过校验。

csrf通过校验

<body>
<h1>我是正儿八经的网站</h1>
<form action="" method="post">
    {% csrf_token %}
    <p>账户:<input type="text" name="username"></p>
    <p>收款人账户:<input type="text" name="target_user"></p>
    <p>转账金额:<input type="text" name="money"></p>
    <input type="submit">
</form>
    
// 只需要加上 {% csrf_token %} 就可以通过校验了。这是正常form表单提交post请求的时候的做法,还有一种可以提交post的就是 ajax 请求。

ajax通过校验

<body>
<h1>我是正儿八经的网站</h1>
<form action="" method="post">
    {% csrf_token %}
    <p>账户:<input type="text" name="username"></p>
    <p>收款人账户:<input type="text" name="target_user"></p>
    <p>转账金额:<input type="text" name="money"></p>
    <input type="submit">
    BUT
</form>
posted @ 2021-06-20 20:11  黑影Poco  阅读(42)  评论(0)    收藏  举报