综述
xss表示Cross Site Scripting(跨站脚本攻击),它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制。
XSS
1.非持久型攻击
通过浏览器执行,从而达到攻击目的,仅仅对当前页面产生影响。
可以在url中插入一段js代码
";
echo "Click to Download";
?>
下面三段代码分别是三种攻击方法,亲测过,chrome浏览器安全性很好,不通,可以拿IE练练手~~~
第一个,简单输出alert对话框
第二个,将标签为a的url改写成为attacker的url
第三个,将攻击代码改为ascii,隐蔽的攻击
http://localhost/test.php?name=guest
http://localhost/test.php?name=
http://localhost/test.php?
name=%3c%73%63%72%69%70%74%3e%77%69%6e%64%6f%77%2e%6f%6e%6c%6f%61%64%20%3d%20%66%75%6e%63%74%69%6f%6e%28%29%20%7b%76%61%72%20%6c%69%6e%6b%3d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%73%42%79%54%61%67%4e%61%6d%65%28%22%61%22%29%3b%6c%69%6e%6b%5b%30%5d%2e%68%72%65%66%3d%22%68%74%74%70%3a%2f%2f%61%74%74%61%63%6b%65%72%2d%73%69%74%65%2e%63%6f%6d%2f%22%3b%7d%3c%2f%73%63%72%69%70%74%3e
如何避免?
XSS之所以会发生, 是因为用户输入的数据变成了代码。 所以我们需要对用户输入的数据进行HTML Encode处理。 将其中的"中括号", “单引号”,“引号” 之类的特殊字符进行编码。
这里注意url encode和html encode; 前者是为了编码的一致性,如不能出现中文等,而后者则是为了避免攻击
2.持久型攻击
持久型攻击,从字面上看即可。意味着这次攻击所影响的时间更为持久。如可以通过一次攻击获取用户的cookie,从而掌握其sessionID,模拟用户和服务器交互,窃取用户信息。
SQL注入
和XSS一样,主要也是利用和用户交互的地方进行攻击,url的query string,文本框等;和XSS不同的是,主要是利用SQL,将(恶意)的SQL命令注入到后台数据库。
举个栗子
有一个关于用户的表,主键为user id,以及一些其他的关于用户的信息;query string传入 http://yourwebsite?uid=1,即可将user_id为1的用户所有信息取出来。
SELECT user_id, user_name, salary,
FROM user_info
WHERE (user_id = 1)
恶意的SQL语句如下 http://yourwebsite?uid=1' or '1'='1
仅仅通过一个简单的恒真表达式就可以进行了一次简单的攻击。
如果猜出表名,则 可以进行各种各样的攻击 http://yourwebsite?uid=1' or 1=(select count(*) from users)--
当我们输入了以上URL后,结果服务器返回我们错误信息,这证明了我们的假设是错误的,那我们该感觉到挫败吗?不,其实这里返回了很多信息,首先它证明了该表名不是users,而且它还告诉我们后台数据库是SQL Server,不是MySQL或Oracle,这也设计一个漏洞把错误信息直接返回给了用户;这样即可以继续进行猜测表名。
总结!
1.永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引号和双"-"进行转换等。
2.永远不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取。
3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4.不要把机密信息明文存放,请加密或者hash掉密码和敏感的信息。
5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装,把异常信息存放在独立的表中。
解释一下:如果需要用户输入为int类型,1.可以使用正则表达式来校验,2.可以通过参数化存储过程中,对参数类型进行设定,但是太多的存储过程也不容易维护;引入3.参数化SQL语句;4.最后,可以对数据库添加新架构,数据库架构是一个独立于数据库用户的非重复命名空间,这样即使hacker猜到了表名,没有架构名称,也无法进行数据库查询~
最后,策略易老,攻击永存,多关注一下安全方面吧~~