注入攻击包括系统命令注入, 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>Windows.location.href="http://attacker.com";</script>
其他用户一旦访问到留言板页面就会执行其中的 JavaScript 脚本, 从而重定向到攻击者写入的站点.
2.3 防范措施
1)html 转义, 转义后可以确保用户输入的内容在浏览器中作为文本显示, 而不是作为代码解析. 这里的转义和 python 中的概念相同, 把变量标记的内容标记为文本, 具体来说, 会把变量中与 HTML 相关的符号转换为安全字符, 以避免变量中包含影响页面输出的 HTML 标签和恶意代码. 转义后, 文本中的特殊字符都会转义成 HTML 实体, HTML 转义如 & lt 表示小于号<.
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)
来源: https://www.cnblogs.com/hwnzy/p/11219475.html