1.注入攻击
注入攻击包括系统命令注入,SQL注入,NoSQL注入,ORM注入等
1.1攻击原理
在编写SQL语句时,如果直接将用户传入的数据作为参数使用字符串拼接的方式插入到SQL查询中,那么攻击者可以通过注入其他语句来执行攻击操作,这些攻击操作包括可以通过SQL语句做的任何事:获取敏感数据、修改数据、删除数据库
1.2攻击示例
cur = db.execute("SELECT * FROM students WHERE password='%s';" % password);
如果攻击者传入的password参数值为 'or 1=1 -- 那么最终的被执行的SQL语句将变成:
SELECT * FROM students WHERE password='' or 1=1 --;'
这样students表中的所有记录全部查询并返回,意味着所有记录都被攻击者窃取了
备注:在SQL中;用来结束一行语句。--用来注释后面的语句
1.3主要防范方法
1)使用ORM可以一定程度避免SQL注入问题
2)验证输入类型,比如限制URL规则中的变量为整型
3)参数化查询,在构造SQL语句中避免拼接字符串或字符串格式化(使用百分号或format方法)
cur = db.execute('SELECT * FROM students WHERE password=%s',password);
4)转义特殊字符,比如引号、分号和横线。使用参数化查询时,各种接口库会为我们做转义工作
2.XSS攻击(Cross-Site Scripting,跨站脚本,因为Cross有交叉的意思故为X,从而区分CSS)
XSS攻击历史悠久,最远可以追溯到90年代,但至今仍然时危害范围非常广的攻击方式。
2.1攻击原理
XSS是注入攻击的一种,攻击者通过将代码注入被攻击者的网站中,用户一旦访问网页就会执行被如注入的恶意脚本。XSS攻击分为反射型XSS攻击和存储型XSS攻击。
2.2攻击示例
反射型XSS又称非持久型XSS。例如如下代码:
response = '<h1>Hello, %s!</h1>' % name;
如果恶意用户输入一段javascript代码作为查询参数name的值
http://example.com/hello?name=<script>alert('Bingo!');</script>
客户端接收的响应将变为下面的代码
<h1>Hello, <script>alert('Bingo!');</script>!</h1>
原本的展示标题就有了弹窗,所以可以通过这种方式执行任意JavaScript代码,如:窃取用户的cookie、重定向到钓鱼网站、发送其他请求。
存储型XSS也被称为持久型XSS,这种类型XSS攻击更常见,危害更大,它和非持久型XSS类似,不过它会把攻击代码存储到数据库中,任何访问包含攻击代码的页面都会殃及。例如:
某个网站通过表单接收用户的留言,如果服务器接收数据后未经处理就存储到数据库中,那么用户可以在留言中插入任意的javascripte代码,例如:
<script>window.location.href="http://attacker.com";</script>
其他用户一旦访问到留言板页面就会执行其中的javascript脚本,从而重定向到攻击者写入的站点。
2.3防范措施
1)HTML转义,转义后可以确保用户输入的内容在浏览器中作为文本显示,而不是作为代码解析。这里的转义和python中的概念相同,把变量标记的内容标记为文本,具体来说,会把变量中与HTML相关的符号转换为安全字符,以避免变量中包含影响页面输出的HTML标签和恶意代码。转义后,文本中的特殊字符都会转义成HTML实体,HTML转义如<表示小于号<。
2)验证用户输入
3.CSRF攻击
CSRF(Cross Site Request Forgery,跨站请求伪造),又被称为one-click attack 或者 session riding。
3.1攻击原理
CSRF攻击方式如下:
用户登录了A网站,认证信息保存在cookie中,当用户访问攻击者创建的B网站时,攻击者通过在B站发送一个伪造的请求提交到A网站服务器上,让A网站服务器误以为请求来自于自己的网站,于是执行相应的操作,该用户信息就遭到了篡改。
3.2攻击示例
3.3防范措施
1)正确使用HTTP方法
-GET方法:属于安全方法,不会改变资源状态,仅用于获取资源,因此又被称为幂等方法,页面中所有可以通过链接发起的请求都属于GET请求。
-POST方法:用于创建、修改和删除资源。在HTML中使用form标签创建表单并设置提交方法为POST,在提交时会创建POST请求。
2)CSRF令牌校验
当处理非GET请求时,除了在表单中加入验证码,一般还可以在表单隐藏字段里和session变量(签名cookie)中中加入伪随机数来防御CSRF攻击,这个伪随机数称为CSRF令牌(token)