上篇文章介绍了几个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=1
MyBatis #与$区别:
#{}: 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数占位符,可以防止SQL注入问题。
${}: 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。
欢迎关注ITSK,每天进步一点点,我们追求在交流中收获成长和快乐