web安全,sql注入,xss,csrf web安全性主要侧重于对web服务器的攻击,这种攻击有 常见的sql注入,跨站脚本攻击(xss),跨站请求伪造(csrf)
sql注入
- 基本概念:
其本质就是,项目中把用户数据与代码进行了拼接,形成了可执行的sql语句
攻击者把sql命令插入到web表单的输入或者页面请求的查询字符串(url),欺骗服务器执行恶意的sql命令
攻击者在web页面预先定义好的sql语句结尾加上额外的sql语句元素,欺骗数据库服务器执行非授权的查询,篡改命令
- 原理:
以把sql插入到web表单的输入为例:
假设的登录查询
SELECT * FROM users WHERE login = 'victor' AND password = '123
Sever端代码
String sql = "SELECT * FROM users WHERE login = '" + formusr + "' AND password = '" + formpwd + "'";
输入字符
formusr = ' or 1=1
formpwd = anything
实际的查询代码
SELECT * FROM users WHERE username = ' ' or 1=1 AND password = 'anything'
- 发现可以进行sql注入的特点:
如何知道某个网站是否能被sql注入是一个很关键的问题
在网上看到一个方法,主要是利用带有查询字符串的url,故意输错一个url中的参数,如果服务器返回的错误结果显示是sql服务器的参数没有被正确编码,则表示这个url是直接触及数据库服务器的,那么就可以进行sql注入了。
但我感觉,像这种直接把sql报错暴露出来的网站,那就是很低级的网站了,而且就是分明想让别人攻击。
- 防范sql注入的方法
首先,可能现在大部分的后台开发,在操作数据时都会使用ORM(ORM,Object-Relationship Mapping,即对象关系映射,是把对象模型表示的对象映射到基于sql的关系模型数据库结构里去),但ORM并不意味着就避免了sql注入危害,具体orm如何被sql注入所影响,我还没有深入的了解。
- 参数化查询方法 这个方法说白了就是利用占位符和参数,对在sql中需要填数据的位置进行限定。 目前的主流ORM框架都支持并推荐这种方式进行持久层封装。
以以下的一条数据库查询语句为例
例: SELECT * FROM myTable WHERE myID = @myID
INSERT INTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)或者INSERT INTO myTable (c1, c2, c3, c4) VALUES(?,?,?,?)
跨站脚本攻击(XSS,Cross Site Scripting,避免和css重名)
- 特征
代码注入
就是恶意用户将代码注入到网页上,其他用户在观看网页时就会收到被注入代码的影响。
这类代码主要是html和js
- 目的:
主要还是窃取用户数据信息或者破坏
- 攻击举例: 如果在论坛中发布一段恶意的js代码就是脚本注入,如果这个代码内容有请求外部服务器,就是xss
- 操作验证:
我在segmenfault网站的一个页面上留言,内容是一段js脚本,如图所示,发表评论后的确可以看到效果 留言页面https://segmentfault.com/a/1190000007059639?utm_source=tag-newest
- 防范方法:
输入过滤:
即对用户输入的数据进行过滤操作,过滤其中的“<”,”>”,”/”,“”script”等脚本关键字,或者对输入数据长度进行限制等等。着重对与用户交互的每一处都进行检测和xss过滤,以有效的阻止xss攻击
输出编码:
在用户输入数据到web应用程序中时,先对数据进行编码,利用htmlEncoder等工具进行编码,然后再把数据输出到页面中,一般可以把输入编码为普通文字,这样以来脚本语言就不会成为html代码的一部分
Cookie防盗
利用xss,攻击者可以窃取用户的cookie,所以可以对cookie中的重要信息进行MD5加密,以防止xss攻击。‘’
跨站请求伪造(Cross-site request forgery)
在用户不知情的情况下,冒充用户发送请求,伪造请求,在当前已登录的网站上执行恶意操作,比如恶意发帖、修改密码等
- 防范方法:
验证码方式, 在一些关键操作上要求输入验证码,防止伪请求
token方式, 向服务器传参数时带上token,token是服务器和用户共同持有的一个随机值。用户提交表单时带上token值,服务器就可以验证表单和session中的token是否一致
XSS和CSRF比较
简单来讲
xss是在用户请求到的html中加入恶意代码,使得用户被恶意代码影响 csrf是盗用浏览器中的登录信息,冒充用户去执行操作
xss主要是对用户数据没有进行转义,使得用户数据影响到了项目代码 csrf主要是http接口在调用上没有进行防范,对于恶意的调用也给与了授权。
xss更侧重代码实现 csrf更侧重结果,即只要是恶意或者冒牌的http请求,就是csrf
通常利用xss实现csrf,具体而言就是利用xss获得用户的cookie,然后冒充用户进行登录,发起恶意的http请求,比如删帖,改密码等