原作者

https://blog.csdn.net/shanhanyu/article/details/80515892?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param
一般来说牛逼点的地方都会通过安全设备来确保网络环境的安全,所以之前我们也都认为程序员不需要过多的考虑网站安全问题。实际上随着做了几个事业单位的网站之后,也逐渐发现有些方面还是需要程序员注意的。

  1. SQL注入 安全等级★★★★★

几乎每一个网站后台开发人员都听到的一个词,并且都很敏感,但是不知道是什么原因造成的很多程序员却在实际开发过程中经常忽视这个问题。前段时间部门一位新同事,据说是5年工作经验,在对他的代码做评审时,我们发现所有的DAO层实现都是直接拼接SQL和参数,总监多次提醒他这个问题,但他也没有发现,直到总监说出SQL注入这个词。

实际上这个漏洞很严重,一旦被注入成功,后果不堪设想,但这类问题处理起来还是蛮简单的,下面以JAVA为例举例说明

方案一: 编写拦截器过滤请求(不推荐),此方案建议只在对维护中项目或者代码结构比较乱的情况下使用,底层不容易修改或者不方便修改。此方案效率低,效果也不佳。

/*** 校验参数,判断是否包含sql关键字表达式* 此方法会有误伤*/ private static boolean sqlValidate(String str) {  str = str.toLowerCase();//统一转为小写String badSqlStr = "'|exec|execute|insert|select|delete|update|count|drop|chr|mid|master|truncate|char|declare|sitename|net user|xp_cmdshell|create|drop|"+"table|from|grant|use|group_concat|column_name|1=1|=|"   +"information_schema.columns|table_schema|union|where|*|"  +"chr|mid|master|truncate|char|declare|or|;|,|like|//|/|%|#|-|--|+|";String badXssStr = "frame|iframe|script|javascript|=|<|>";//sql 关键词 有空格分隔String[] badSqlStrs = badSqlStr.split("\\|");  for (int i = 0; i < badSqlStrs.length; i++) {  if (str.indexOf(" "+badSqlStrs[i]) >= 0 || str.indexOf(badSqlStrs[i]+" ") >= 0) {  return true;  }  }} return false;
}

方案二:推荐方案,使用预编译的prepareStatement代替statement;使用框架中的setParameter设置参数,此方案可有效处理SQL注入问题。

@Overridepublic List<NewsColumn> getColumnListByType(String columnType) {String jql = " FROM "+NewsColumn.class.getName()+" WHERE type=:type ";List<NewsColumn> list = entityManager.createQuery(jql).setParameter("type", columnType).getResultList();return list;}
  1. 验证码必须后台校验 安全等级★★★★

前段时间一客户说后台管理看到了一堆这样用户,/etc/init.d /1=1 ./././ …. Windows/ ,本该截图的,后来处理了就给忘了~~~~,反正从注册内容来看,可以确定两点,通过注册机注册,想通过注册注入攻击。

通过机器注册:直接跳过了前端的表单校验,而恰巧这个项目在开发的时候,验证码只在前端做了校验,提交到后台没有做再一次的校验,也就是这个漏洞导致了这堆垃圾注册。

解决方案:前台提交数据到后台后做进一步校验,如验证码校验、数据格式校验、验重校验。

回想我也曾经用过这个漏洞…老东家海航集团2014年的时候,OA系统添加了登录需要手机短信验证,当时系统更新后第一个版本就是仅做了前台校验,这个漏洞无意中被我发现了,因为每天都要登录OA,每次都要短信实在太麻烦了,我就尝试模拟了个表单请求,重写原登录系统表单提交的脚本,在所有的验证我都直接返回true。很激动的是,一次就成功了,后来也分享给我们同事了,大家都很开心。但随后不久,系统就升级了,后台验证,你们懂得。当然对当时的信息部同事来说,我就是一个坏人……

  1. 防止表单重复提交 安全等级★★★

防止表单重复提交其实网上有很多解决方案,并且现在主流的前端框架都可以在页面上做按钮控制,不过做为一个程序员,你们懂得,这并没有什么卵用。个人还是建议采用实际的后台验证法处理。从网上爬文,看到的靠谱的解决方案如下。

解决方案:token验证,请求页面时生成token并放在session中,提交表单到后台验证token,业务逻辑处理完之后,清除token。如果表单提交了一次,token就没了,再次提交就无法通过了。

方案分析:此方法和验证码基本上一致,如果验证码在每次表单提交后都清除一次,也能达到这样的效果。

其他建议:重要的表单页面提交后重定向,取消表单的autocomplete。

  1. 文件上传格式校验 安全等级★★★★

黑客攻击网站还有一个常见的方式就是通过文件上传漏洞,比如网站上传图片的功能没有严格校验后缀名。黑客可以通过此功能上传一些脚本文件,上传成功后,通过请求这些脚本文件运行脚本中的功能达到攻击的目的。

那么如果验证了上传文件的后缀名就可以吗?实际上并不是,举例说我们知道页面引入script标签时src写啥都行,比如http://www.baidu.com/123.jpg,也是可以的,攻击者只需要把一个script文件后缀名改为jpg即可通过后缀验证,后面一路畅通。所以这就提到了验证文件的真实格式。如何验证,网上一大堆…

解决方案:设置php文件、jsp文件不可直接被访问(不知道php可以不,jsp放在WEB-INF即可),这样攻击者上传此类文件也无法执行;通过文件头信息严格验证文件格式,从上传功能开始防范。

  1. 熟悉使用框架或数据库版本情况 安全等级★★

实际开发中,我们都使用一些开源框架,但这些框架也不是百分百完善的,比如webwork,struts2就经常爆出一些漏洞,这个需要开发者自行关注。

解决方案:根据官方发布的方案进行版本升级;根据公开的漏洞执行方式编写拦截器。

Struts2 s2-016 漏洞处理实例(项目结构不允许版本升级),拦截器,实际上官方的版本也是升级后过滤了一些参数。

@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;HttpServletResponse res = (HttpServletResponse)response;//禁止页面被frameres.addHeader("x-frame-options","SAMEORIGIN"); Map parameterMap = req.getParameterMap();for (Iterator iterator = parameterMap.keySet().iterator(); iterator.hasNext();) {String key = (String) iterator.next();if ((key.contains("redirect:")) || (key.contains("redirectAction:")) || (key.contains("action:"))) {res.sendError(HttpServletResponse.SC_FORBIDDEN, "forbidden");System.out.println("----------非法操作-----------");return;}}filterChain.doFilter(request, response);}
  1. 严禁在生产环境下使用缺省密码 安全等级★★

很多时候一些小网站,新人练手的网站(往往价格很便宜),在开发的过程中都要求很快,往往这些网站问题还是蛮多的。后台验证码处于关闭状态、账号密码常用admin/admin组合,看似方便了操作,实际是危险重重。甚至有时候,数据库链接密码都是root/空,这个危害大家都知道。由于没有验证码,用户密码又使用的缺省的,黑客爆破的概率异常的高,一旦获取了后台管理权限,剩下的就交给你了。

解决方案:通过配置测试模式和生产模式控制验证码验证,管理员账户必须使用非缺省加密处理,必要时使用物理验证。

  1. 服务器端口尽可能少开 安全等级★★★

六月份一个客户的服务器被挂马了,服务器一直是他们自行维护,只在项目更新时给我们开放远程。无意中发现服务器防火墙竟然是关闭状态我的天呐,是不是所有端口都处于开放状态呐你们以为这就是惊喜,惊喜还在后面呢,客户提供的MySQL数据库用户名明码是root root,个人认为这个才是惊喜。root/root和root/空是一样的效果。分析了一下,防火墙关闭了,3306也就开了,黑客发现3306开着,root/root能连接,通过windows漏洞提升root用户为系统用户,bingo,竟然可以登录这台服务器欸,简直棒棒哒。

解决方案:防护墙打开,仅开放必要的端口如80,13389,设置远程登录IP白名单。再次强调不要用缺省账户。

  1. Options方法过滤 安全等级★

这个问题网上提到的都是很严重,但现在并没有发现多少案例,或许处理方案比较简单吧。

解决方案:在web.xml添加配置

<!-- 过滤不安全的请求方法 -->  <security-constraint>     <web-resource-collection>     <url-pattern>/*</url-pattern>     <http-method>PUT</http-method>     <http-method>DELETE</http-method>     <http-method>HEAD</http-method>     <http-method>OPTIONS</http-method>     <http-method>TRACE</http-method></web-resource-collection>     <auth-constraint>     </auth-constraint>     </security-constraint>     <login-config>     <auth-method>BASIC</auth-method>     </login-config>
  1. XSS攻击、CSRF攻击 安全等级★

XSSS攻击处理方案一般来说也是通过拦截器过滤请求参数,都是常规的处理方案。

package com.interceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;/*** <p>*  类说明* </p>* @author shy* @date 2016-4-21 下午03:34:26* @vesion $Revision$ $Date$ */public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {HttpServletRequest orgRequest = null;  public XssHttpServletRequestWrapper(HttpServletRequest request) {  super(request);  orgRequest = request;  }  /** * 覆盖getParameter方法,将参数名和参数值都做xss过滤。<br/> * 如果需要获得原始的值,则通过super.getParameterValues(name)来获取<br/> * getParameterNames,getParameterValues和getParameterMap也可能需要覆盖 */  @Override  public String getParameter(String name) {  String value = super.getParameter(xssEncode(name));  if (value != null) {  value = xssEncode(value);  }  return value;  }  /** * 覆盖getHeader方法,将参数名和参数值都做xss过滤。<br/> * 如果需要获得原始的值,则通过super.getHeaders(name)来获取<br/> * getHeaderNames 也可能需要覆盖 */  @Override  public String getHeader(String name) {  String value = super.getHeader(xssEncode(name));  if (value != null) {  value = xssEncode(value);  }  return value;  }  /** * 将容易引起xss漏洞的半角字符直接替换成全角字符 * * @param s * @return */  private static String xssEncode(String s) {  if (s == null || "".equals(s)) {  return s;  }  StringBuilder sb = new StringBuilder(s.length() + 16);  for (int i = 0; i < s.length(); i++) {  char c = s.charAt(i);  switch (c) {  case '>':  sb.append('>');//全角大于号break;  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(c);  break;  }  }  return sb.toString();  }  /** * 获取最原始的request * * @return */  public HttpServletRequest getOrgRequest() {  return orgRequest;  }  /** * 获取最原始的request的静态方法 * * @return */  public static HttpServletRequest getOrgRequest(HttpServletRequest req) {  if (req instanceof XssHttpServletRequestWrapper) {  return ((XssHttpServletRequestWrapper) req).getOrgRequest();  }  return req;  }
}

CSRF攻击(这个还在学习中)

解决方案:从网上爬文看到的基本上是一致的,校验Referer,添加请求token验证,个人觉得此漏洞在大型系统中比较重视,小网站就呵呵了。

  1. frame引入控制 安全等级★

这个不知道为什么会被列入网站安全问题中,一个客户网站找了第三方安全检测公司检测网站有这个漏洞,所以就不得不处理。网上抄来的。

Java代码(拦截器中使用):

response.addHeader(“x-frame-options”,“SAMEORIGIN”);

Nginx配置:

add_header X-Frame-Options SAMEORIGIN

Apache配置:

Header always append X-Frame-Options SAMEORIGIN

为毛没有tomcat的配置方式呢???

网站10大常见安全漏洞及解决方案相关推荐

  1. 十大常见web漏洞及防范

    十大常见web漏洞 一.SQL注入漏洞 SQL注入攻击(SQL Injection),简称注入攻击.SQL注入,被广泛用于非法获取网站控制权,是发生在应用程序的数据库层上的安全漏洞.在设计程序,忽略了 ...

  2. Python中的10个常见安全漏洞及修复方法

    Python中的10个常见安全漏洞及修复方法 写安全的代码很困难,当你学习一门编程语言.一个模块或框架时,你会学习其使用方法.在考虑安全性时,你需要考虑如何避免代码被滥用,Python也不例外,即使在 ...

  3. python中常见的漏洞_注意!Python中的10个常见安全漏洞及修复方法

    原标题:注意!Python中的10个常见安全漏洞及修复方法 源 /Python程序员 编写安全的代码很困难,当你学习一门编程语言.一个模块或框架时,你会学习其使用方法.在考虑安全性时,你需要考虑如何避 ...

  4. 你应该知道的 10 大常见技术

    使用简单攻击,可以了解您可能不想透露的未经授权的个人信息.了解这些常见的技术,如网络钓鱼.DDoS.点击劫持等,可以为您的人身安全派上用场. 由于这些原因,了解一些通常用于以未经授权的方式获取您的个人 ...

  5. 跨站点请求伪造_十大常见web漏洞——跨站点请求伪造(CSRF)

    CSRF介绍 什么是CSRF呢?我们直接看例子. https://mp.toutiao.com/profile_v3/graphic/preview?do=delete&pgc_id=6829 ...

  6. 希尔排序的详细过程_算法系列: 10大常见排序算法(4)希尔排序

    本课程是从少年编程网转载的课程,目标是向中学生详细介绍计算机比赛涉及的编程语言,数据结构和算法.编程学习最好使用计算机,请登陆 www.3dian14.org (免费注册,免费学习). 一句 希尔排序 ...

  7. 数据库 10 大常见安全问题盘点~

    数据库已经成为黑客的主要攻击目标,因为它们存储着大量有价值和敏感的信息. 这些信息包括金融.知识产权以及企业数据等各方面的内容.网络罪犯开始从入侵在线业务服务器和破坏数据库中大量获利,因此,确保数据库 ...

  8. python框架漏洞_注意!Python中的10个常见安全漏洞及修复方法

    编写安全的代码很困难,当你学习一门编程语言.一个模块或框架时,你会学习其使用方法.在考虑安全性时,你需要考虑如何避免代码被滥用,Python也不例外,即使在标准库中,也存在着许多糟糕的实例.然而,许多 ...

  9. python 不安全的包或方法_Python中的10个常见安全漏洞及修复方法

    写安全的代码很困难,当你学习一门编程语言.一个模块或框架时,你会学习其使用方法.在考虑安全性时,你需要考虑如何避免代码被滥用,Python也不例外,即使在标准库中,也存在着许多糟糕的实例.然而,许多 ...

最新文章

  1. 15-5重构_重构-糟糕,我一直在向后做。
  2. 技术分享:浅谈Service Mesh在瓜子的实践
  3. login控件设置居中
  4. SAP Spartacus 的路由配置
  5. 一文读懂Python web框架和web服务器之间的关系
  6. 解析大型.NET ERP系统 高质量.NET代码设计模式
  7. 怎么灵活使用Graph, Document, Key/Value 三种混合模型的数据库?--Java 10分钟教程
  8. HDU 5411 CRB and Puzzle(矩阵快速幂+可达矩阵)
  9. 云从科技在科创板IPO注册获批,收入远高于格灵深瞳同期
  10. 带你领略MotionLayout的魅力(中)
  11. python数据分析实战:DCM模型设计及实现(以波音公司用户选择为例)
  12. IMSI、IMEI和MEID(ESN)
  13. 坏小子军团Stary造了一块电动滑板,想帮你用最低的代价去耍(zhuang)酷(bi)
  14. 软件测试之测试主流技能
  15. linux vim操作提示:“Can't open file for writing”或“operation not permitted”的解决办法
  16. linux操作系统版本_史上最全的Linux 各个发行版本的优点、缺点、发展史介绍
  17. Matrix Profile介绍
  18. mysql校验日期是否有效_Mysql 根据出生日期计算年龄 判断起始日期是否在某个有效时间段内等日期Hack汇总...
  19. obsidian第三方插件无法加载
  20. OpenGL基础图形编程

热门文章

  1. Linux RocketMQ安装
  2. Python-Django毕业设计安卓基于Android的手机点餐App系统(程序+LW)
  3. 【听译大师说话】python 创始人访谈录 1: 关于 django 和 ruby
  4. 语音验证码是怎么发的?如何选择语音验证码平台?
  5. React SSR路由支持实现
  6. 国产论坛系统 Discuz! 收藏该软件 我的收藏夹/设置
  7. ROS采集GPS/北斗数据在百度地图中可视化位置
  8. 如何一步开启容器时代?青云QingCloud有话要说
  9. Lua内存泄露检查和性能检测工具
  10. 基于Matlab----多径衰落信道