人一生当中,最重要的是,清楚自己想要什么,明白自己能做什么。千万不要等到生命终结的时候,才后悔没有得到想要的,没有去做能做的,从而虚度了人生。
上篇文章介绍了几个Web常见攻击手段:防盗链、CSRF攻击还有安全漏洞像文件上传漏洞、密码漏洞等,这篇文章我们介绍一下:XSS攻击和sql注入。
XSS攻击
什么是XSS攻击?
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是Javascript,但实际上也可以包括Java、 Vbscript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和COOKIE等各种内容。(摘自百科)
简单讲就是:通过利用网页开发时留下的漏洞,恶意攻击者往Web页面里插入恶意 Script代码,当用户浏览时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
XSS攻击原理?
使用JS脚本语言,因为浏览器默认支持脚本语言执行,如果在表单提交的时候,提交一些脚本参数,可能浏览器直接执行。
XSS常见漏洞?
① 通过 document.COOKIE 盗取 COOKIE中的信息,读取本地COOKIE远程发送给黑客服务器端;
②表单提交的时候:论坛、评论等,eg:表单提交的时候输入:
③ 使用 js或 css破坏页面正常的结构与样式;
④流量劫持(通过访问某段具有 window.location.href 定位到其他页面:);
XSS攻击防御手段:将脚本特殊字符,转换成html源代码进行展示,我们在Java中可以写一个过滤器,拦截获取所有参数,将特殊字符转换成HTML展示,举个栗子如下代码:
过滤器如下:
@WebFilter(filterName = "xssFilter", urlPatterns = "/*")
public class XssFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 程序防止XSS攻击原理
// 1. 使用过滤器拦截所有参数
HttpServletRequest req = (HttpServletRequest) request;
// 2.重写getParameter方法
XssHttpServletRequestWrapper xssHttpServletRequestWrapper = new XssHttpServletRequestWrapper(req);
// 放行程序,继续往下执行
chain.doFilter(xssHttpServletRequestWrapper, response);
}
public void destroy() {
}
}
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
private HttpServletRequest request;
/**
* @param request
*/
public XssHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
this.request = request;
}
@Override
public String getParameter(String name) {
// 获取之前的参数
String olValue = super.getParameter(name);
System.out.print("原来参数:" + olValue);
if (!StringUtils.isEmpty(olValue)) {
// 将特殊字符转换成html展示 // 3.使用(StringEscapeUtils.escapeHtml(name)转换特殊参数
olValue = StringEscapeUtils.escapeHtml(olValue);
System.out.println("转换后" + olValue);
}
System.out.println();
return olValue;
}
}
commons-lang 包下提供了接下html的工具类,如果使用springboot,记得加 @ServletComponentScan这个注解,否则扫描不到:@WebFilter。
Sql注入
什么是Sql注入?
SQL注入:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库执行一些恶意的作。
造成SQL注入的原因是因为程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查询代码,程序在接收后错误的将攻击者的输入作为查询语句的一部分执行,导致原始的查询逻辑被改变,额外的执行了攻击者精心构造的恶意代码。
Sql注入防攻击手段:
不要使用拼接SQL语句方式、最好使用预编译方式。比如使用mybatis时,在mybatis编写sql语句的时候,最好使用#传参数方式,不要使用$传参数,因为$传参数方式,可能会受到sql语句攻击。
eg:http://127.0.0.1:8080/lgin?userName='zs'&password='123'
http://127.0.0.1:8080/login?userName='zs'&password='123' or 1=1MyBatis #与$区别:
#{}: 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数占位符,可以防止SQL注入问题。
${}: 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。
欢迎关注ITSK,每天进步一点点,我们追求在交流中收获成长和快乐