WEB安全:XSS漏洞与SQL注入漏洞介绍及解决方案
对web安全方面的知识非常薄弱,这篇文章把Xss跨站攻击和sql注入的相关知识整理了下,希望大家多多提意见。
对于防止sql注入发生,我只用过简单拼接字符串的注入及参数化查询,可以说没什么好经验,为避免后知后觉的犯下大错,专门参考大量前辈们的心得,小小的总结一下,欢迎大家拍砖啊
一、跨站脚本攻击(XSS)
跨站脚本攻击的原理
XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意脚本代码,而程序对于用户输入内容未过滤,当用户浏览该页之时,嵌入其中Web里面的脚本代码会被执行,从而达到恶意攻击用户的特殊目的。
跨站脚本攻击的危害:窃取cookie、放蠕虫、网站钓鱼 ...
跨站脚本攻击的分类主要有:存储型XSS、反射型XSS、DOM型XSS
XSS漏洞是Web应用程序中最常见的漏洞之一。如果您的站点没有预防XSS漏洞的固定方法,那么就存在XSS漏洞。这个利用XSS漏洞的病毒之所以具有重要意义是因为,通常难以看到XSS漏洞的威胁,而该病毒则将其发挥得淋漓尽致。
XSS工作流程
如下情况,请求跳转到百度,并将查询到的cookie值也显示出来了
结果将导致:
更详细的Xss原理等知识请参考园内大拿“小坦克”的这篇文章 Web安全测试之XSS
那我们要如何防御Xss?
一种方法是在表单提交或者url参数传递前,对需要的参数进行过滤,请看如下XSS过滤工具类代码
import java.net.URLEncoder; /**
* 过滤非法字符工具类
*
*/
public class EncodeFilter { //过滤大部分html字符
public static String encode(String input) {
if (input == null) {
return input;
}
StringBuilder sb = new StringBuilder(input.length());
for (int i = , c = input.length(); i < c; i++) {
char ch = input.charAt(i);
switch (ch) {
case '&': sb.append("&");
break;
case '<': sb.append("<");
break;
case '>': sb.append(">");
break;
case '"': sb.append(""");
break;
case '\'': sb.append("'");
break;
case '/': sb.append("/");
break;
default: sb.append(ch);
}
}
return sb.toString();
} //js端过滤
public static String encodeForJS(String input) {
if (input == null) {
return input;
} StringBuilder sb = new StringBuilder(input.length()); for (int i = , c = input.length(); i < c; i++) {
char ch = input.charAt(i); // do not encode alphanumeric characters and ',' '.' '_'
if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z' ||
ch >= '' && ch <= '' ||
ch == ',' || ch == '.' || ch == '_') {
sb.append(ch);
} else {
String temp = Integer.toHexString(ch); // encode up to 256 with \\xHH
if (ch < ) {
sb.append('\\').append('x');
if (temp.length() == ) {
sb.append('');
}
sb.append(temp.toLowerCase()); // otherwise encode with \\uHHHH
} else {
sb.append('\\').append('u');
for (int j = , d = - temp.length(); j < d; j ++) {
sb.append('');
}
sb.append(temp.toUpperCase());
}
}
} return sb.toString();
} /**
* css非法字符过滤
* http://www.w3.org/TR/CSS21/syndata.html#escaped-characters */
public static String encodeForCSS(String input) {
if (input == null) {
return input;
} StringBuilder sb = new StringBuilder(input.length()); for (int i = , c = input.length(); i < c; i++) {
char ch = input.charAt(i); // check for alphanumeric characters
if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z' ||
ch >= '' && ch <= '') {
sb.append(ch);
} else {
// return the hex and end in whitespace to terminate
sb.append('\\').append(Integer.toHexString(ch)).append(' ');
}
}
return sb.toString();
} /**
* URL参数编码
* http://en.wikipedia.org/wiki/Percent-encoding */
public static String encodeURIComponent(String input) {
return encodeURIComponent(input, "utf-8");
} public static String encodeURIComponent(String input, String encoding) {
if (input == null) {
return input;
}
String result;
try {
result = URLEncoder.encode(input, encoding);
} catch (Exception e) {
result = "";
}
return result;
} public static boolean isValidURL(String input) {
if (input == null || input.length() < ) {
return false;
}
char ch0 = input.charAt();
if (ch0 == 'h') {
if (input.charAt() == 't' &&
input.charAt() == 't' &&
input.charAt() == 'p') {
char ch4 = input.charAt();
if (ch4 == ':') {
if (input.charAt() == '/' &&
input.charAt() == '/') { return isValidURLChar(input, );
} else {
return false;
}
} else if (ch4 == 's') {
if (input.charAt() == ':' &&
input.charAt() == '/' &&
input.charAt() == '/') { return isValidURLChar(input, );
} else {
return false;
}
} else {
return false;
}
} else {
return false;
} } else if (ch0 == 'f') {
if( input.charAt() == 't' &&
input.charAt() == 'p' &&
input.charAt() == ':' &&
input.charAt() == '/' &&
input.charAt() == '/') { return isValidURLChar(input, );
} else {
return false;
}
}
return false;
} static boolean isValidURLChar(String url, int start) {
for (int i = start, c = url.length(); i < c; i ++) {
char ch = url.charAt(i);
if (ch == '"' || ch == '\'') {
return false;
}
}
return true;
} }
乌云网有很多关于xss报错的bug记录,如http://www.wooyun.org/bugs/wooyun-2010-016779
SQL注入漏洞
SQL注入攻击的原理:
使用用户输入的参数拼凑SQL查询语句,使用户可以控制SQL查询语句。详细关于sql注入的信息请参考:SQL注入攻防入门详解
防御方法
- 使用预编译语句,
- 绑定变量
- 使用安全的存储过程
- 检查数据类型
- 使用安全函数
建议方法:不要使用拼接的sql,使用占位符,例如使用JdbcTemplate,
下面给出一种解决方法:用下面的各种函数代替拼接sql的出现
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; public class SqlBuilder {
protected StringBuilder sqlBuf = new StringBuilder();
protected List<Object> values = new ArrayList<Object>();
protected Map<String, Object> paramMap = new HashMap<String, Object>(); public SqlBuilder appendSql(String sql) {
sqlBuf.append(sql);
return this;
} public SqlBuilder appendValue(Object value) {
sqlBuf.append('?');
values.add(value);
return this;
} public SqlBuilder appendValues(Object[] values) {
sqlBuf.append('(');
for (int i = , c = values.length; i < c; ++i) {
sqlBuf.append('?').append(',');
this.values.add(values[i]);
}
int last = sqlBuf.length() - ;
if (last > && sqlBuf.charAt(last) == ',') {
sqlBuf.setCharAt(last, ')');
}
return this;
} public SqlBuilder appendEqParam(String param, Object value) {
sqlBuf.append(param).append(" = :").append(param);
paramMap.put(param, value);
return this;
} public SqlBuilder appendLtParam(String param, Object value) {
sqlBuf.append(param).append(" < :").append(param);
paramMap.put(param, value);
return this;
} public SqlBuilder appendGtParam(String param, Object value) {
sqlBuf.append(param).append(" > :").append(param);
paramMap.put(param, value);
return this;
} public SqlBuilder appendInParam(String param, Object ... values) {
if(values == null) {
return this;
}
sqlBuf.append(param).append(" in (");
int len = values.length;
for(int i = ; i < len; i++) {
if(i != ) {
sqlBuf.append(", ");
}
sqlBuf.append(":").append(param).append(i);
paramMap.put(param+i, values[i]);
}
sqlBuf.append(")");
return this;
} public SqlBuilder appendLikeParam(String param, Object value) {
sqlBuf.append(param).append(" like :").append(param);
paramMap.put(param, "%"+value+"%");
return this;
} public String getSql() {
return sqlBuf.toString();
} public Object[] getValues() {
return values.toArray();
} public Map<String, Object> getParamMap() {
return paramMap;
}
}
上面的两种漏洞对于web开发会经常遇到,此外还有拒绝服务攻击漏洞、跨站请求伪造(CSRF)、开放重定向漏洞等等,以后再慢慢学习!!!
WEB安全:XSS漏洞与SQL注入漏洞介绍及解决方案的更多相关文章
- Nikto是一款Web安全扫描工具,可以扫描指定主机的web类型,主机名,特定目录,cookie,特定CGI漏洞,XSS漏洞,SQL注入漏洞等,非常强大滴说。。。
Nikto是一款Web安全扫描工具,可以扫描指定主机的web类型,主机名,特定目录,cookie,特定CGI漏洞,XSS漏洞,SQL注入漏洞等,非常强大滴说... root@xi4ojin:~# cd ...
- WEB安全:XSS漏洞与SQL注入漏洞介绍及解决方案(转)
对web安全方面的知识非常薄弱,这篇文章把Xss跨站攻击和sql注入的相关知识整理了下,希望大家多多提意见. 对于防止sql注入发生,我只用过简单拼接字符串的注入及参数化查询,可以说没什么好经验,为避 ...
- 简单分析什么是SQL注入漏洞
现在很多人在入侵的过程中基本都是通过SQL注入来完成的,但是有多少人知道为什么会有这样的注入漏洞呢?有的会随口说着对于字符的过滤不严造成的.但是事实是这样吗?我们学这些,不仅要知其然,更要知其所以然! ...
- 什么是简单的分析SQL注入漏洞
如今非常多人在入侵的过程中基本都是通过SQL注入来完毕的,可是有多少人知道为什么会有这种注入漏洞呢?有的会随口说着对于字符的过滤不严造成的. 可是事实是这样吗?我们学这些.不仅要知其然.更要知其所以然 ...
- web应用程序安全攻防---sql注入和xss跨站脚本攻击
kali视频学习请看 http://www.cnblogs.com/lidong20179210/p/8909569.html 博文主要内容包括两种常见的web攻击 sql注入 XSS跨站脚本攻击 代 ...
- 10年前,我就用 SQL注入漏洞黑了学校网站
我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...
- 利用SQL注入漏洞登录后台的实现方法
利用SQL注入漏洞登录后台的实现方法 作者: 字体:[增加 减小] 类型:转载 时间:2012-01-12我要评论 工作需要,得好好补习下关于WEB安全方面的相关知识,故撰此文,权当总结,别无它意.读 ...
- 预处理prepareStatement是怎么防止sql注入漏洞的?
序,目前在对数据库进行操作之前,使用prepareStatement预编译,然后再根据通配符进行数据填值,是比较常见的做法,好处是提高执行效率,而且保证排除SQL注入漏洞. 一.prepareStat ...
- zabbix再爆高危SQL注入漏洞,可获系统权限
漏洞概述 zabbix是一个开源的企业级性能监控解决方案.近日,zabbix的jsrpc的profileIdx2参数存在insert方式的SQL注入漏洞,攻击者无需授权登陆即可登陆zabbix管理系统 ...
随机推荐
- mysql 添加索引 mysql 创建索引
1.添加PRIMARY KEY(主键索引) mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2.添加UNIQUE(唯一索引 ...
- Bootstrap之栅格系统
bootstrap 移动优先 中文官网 http://www.bootcss.com/ 1.基本模板 <!DOCTYPE html> <html lang="en&quo ...
- iOS UINavigationController的使用
NavigationController,又称导航控制器.是iOS开发中比较常用的一种容器ViewController,常用于页面的管理和切换. 在开发中,NavigationController常常 ...
- Git remote 修改源
Git remote 修改源 git commit -m "Change repo." # 先把所有为保存的修改打包为一个commit git remote remove orig ...
- python-切片 迭代 生成器
1 切片操作 >>> L ['aaa', 'bbb', 'ccc', 'ddd'] >>> L[0:3] ['aaa', 'bbb', 'ccc'] >> ...
- .Net中使用SendGrid Web Api发送邮件(附源码)
SendGrid是一个第三方的解决邮件发送服务的提供商,在国外使用的比较普遍.国内类似的服务是SendCloud.SendGrid提供的发送邮件方式主要是两种, 一种是SMTP API, 一种是Web ...
- Oracle数据库shutdown immediate被hang住的几个原因
实验操作环境: 操作系统:Red Hat Enterprise Linux ES release 4 (Nahant Update 6) ...
- 使用NetBeans、Eclipse阅读JDK源码
下面说明在Netbeans.Eclipse环境下怎么查看JDK源码: Netbeans: 在"工具->java平台->源"里添加下路径,如果你安装jdk的时候选择安装了 ...
- MongoDB学习笔记~大叔分享批量添加—批量更新—批量删除
回到目录 说它是批量操作,就是说将集合对象一次提交到服务器,并对数据进行持久化,如果您的代码是一次一次的提交,那不算是批量操作!在之前的mongodb仓储中并没有对批量更新和批量删除进行实现,而今天在 ...
- springmvc学习资料整理
springmvc接口开发返回XML/JSON数据 1.SpringMVC中使用@RequestBody,@ResponseBody注解实现Java对象和XML/JSON数据自动转换(上):http: ...