常见web攻击及防范
sql注入攻击
sql注入的危害
非法读取、篡改、删除数据库中数据
盗取用户的各类敏感信息,获取利益
通过修改数据库来修改网页上的内容
注入木马等
下面的例子告诉你,sql实现注入的原理
def post(self,request):
user_name = request.POST.get("username", "")
pass_word = request.POST.get("password", "")
import pyMySQL
conn = pyMySQL.connect(
'NAME': "mxonline",
'USER':'root',
'PASSWORD':'',
'HOST':'127.0.0.1'
)
cursor = conn.cursor()
sql_select = "select * from users where username='{0}' and password='{1}'".format(username,password)
result = cursor.execute(sql_select)
for row in cursor.fetchall(): # 检查数据库是否有该用户
# 查询到用户
pass
print("没有查询到用户")
前端输入:
用户名:' or 1=1#
密码随便输入:1234
前端没有做任何处理就会原原本本的传给后端,
后端收到用户名和密码,没有做任何处理,传进sql后就会是下面这样子:
sql_select = "select * from users
where username=\'\' or 1=1#\' and password=\'1234'\"
username='' or 1=1 用户名=空 或者 1=1一定会成立,sql_select语句执行一定会,然后绕过,后面的因为被注释了不会执行
该sql一定会执行通过,然后登录到系统
预防的措施很简单,
1.前端对输入的用户名和密码做有效检查,比如不能出现单引号等特殊符号
2.后端同样对前端传过来的数据做有效性识别,对无效的数据直接抛弃
xss跨站脚本攻击 cross site scripting
xss攻击流程
上面这个流程是常见的一个客户端向服务器发起请求url,服务器响应数据给客户端的过程
下面黑客可以通过url的key=value
(key=)
场景描述:
黑客控制了受害者(受害者成为了肉鸡),将url伪装成上面括号的样子,发送到服务器,服务器执行脚本后返回cookie给受害者,受害者把cookie中的sessionid发送给黑客,黑客拿到用户的sessionid就可以伪装成用户直接请求服务器中的数据,比如黑客已经窃取了后台管理员账号的cookie,那么就可以进入用户中心,拿到用户中心的所有用户数据。
xss预防措施:
1.代码里对用户输入的地方和变量都需要仔细检查长度和对" < "," > "," ; "," ' "等字符做过滤或者转义,把他encode掉。
2.避免直接在cookie中泄露用户隐私,例如email、密码等,通过使用cookie和系统ip绑定来降低cookie泄露后的危险
3.尽量采用post而非get请求表单
csrf 跨站点请求伪造 cross-site request forgery
csrf危害
以你的名义发送邮件
盗取你的账号
购买商品
虚拟货币转账
csrf攻击原理
场景:
在浏览器打开一个信任的网站,(session有效)然后在该浏览器新打开一个标签页(危险网站)。
<img src=http://www.mybank.com/Transfer/toBankId=11*&money=1000>
既是使用post请求,也一样会被攻击,以下面这段代码为例(实际就是哦攻击网站的源码):
自定义一个form,在用户浏览器加载完html后,自动执行该段代码发起post请求,实现csrf攻击
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
function steal()
{
iframe = document.frames["steal"];
iframe.document.Submit("transfer");
}
</script>
</head>
<body onload="steal()">
<iframe name="steal" display="none">
<form method="POST" name="transfer" action="http://www.myBank.com/Transfer">
<input type="hidden" name="toBankId" value="622909123456">
<input type="hidden" name="money" value="1000">
</form>
</iframe>
</body>
</html>>
预防措施:
django在前端页面表单提交里面,每次表单提交都一定要带上{% csrf_token %},才能完成表单提交,以此来防护csrf攻击,攻击网站是无法生成 csrf_token的,即使生成了,他也无法完成后台验证