日期:2014-05-18  浏览次数:20796 次

WEB安全:基于struts进行电子商务网站开发
大家好,最近准备进行一个类似于阿里巴巴的网站开发,用于发布企业信息和产品,本身安全性要求较高,暂时不考虑支付因素,此外,可能要加入企业管理方面功能。
打算struts,jsp,不过我之前都是VC,Delphi,2个月前才开始eclipse学习,没有接触过此类项目,所以还要向大家多多请教。

程序安全方面从网站上总结了以下这些方面,不过因为之前没有接触过网站开发,希望大家能给看看,多多提意见和建议。谢谢!

1.验证码及用户验证/b]
  涉及用户重要信息的表单提交均须输入验证码;
  session验证用户,Session集中放在中间层服务器端。
[color=#0000FF][b]2.传递数据加密
[/color]
  客户请求包含传输敏感数据情况下,使用POST方法;
  加密机制(例如,通过SSL连接)。
  问题:url加密需要自己做么?
3.用户输入验证
  1)使用过滤器对用户发起的请求进行检查,检验用户合法性后,再通知服务器进行相应处理;
  2)正向输入过滤,列举不安全的字符并拒绝它们;
  3)利用正则表达式只允许输入指定的字符;
  4)始终对所有的用户输入执行验证,且验证必须在一个可靠的平台上进行,应当在应用的多个层上进行。 
  5)除了输入、输出功能必需的数据之外,不允许其他任何内容。 
  6)设立“信任代码基地”,允许数据进入信任环境之前执行彻底的验证。 
  7)登录数据之前先检查数据类型。 
  8)详尽地定义每一种数据格式,例如缓冲区长度、整数类型等。 
  9)严格定义合法的用户请求,拒绝所有其他请求。 
  测试数据是否满足合法的条件,而不是测试不合法的条件。因为数据不合法的情况很多,难以详尽列举。
4.防止路径暴露
  1)自定义错误页面,以防暴露服务器信息及路径等信息。
  2)信息加密存储,对数据库连接字符串、用户秘密等敏感信息进行加密存储,以妥善保护数据。(具体操作上不大清楚)
3)后台管理设置

5.上传安全

  限制后缀,限制web容器执行权限、配置过滤器机制。

6.跨站攻击
看了几篇资料,不过依然觉得盲目,过滤器就可以么?

7.禁止外部提交

(从网站上搜到一个方法,不过不明白)
  < %
  server_v1=Cstr(Request.ServerVariables("HTTP_REFERER"))
  server_v2=Cstr(Request.ServerVariables("SERVER_NAME"))
  if mid(server_v1,8,len(server_v2))<>server_v2 then
  % >
  您的操作非法,请登陆后操作!
  < %
  Response.Redirect "Fuck-Hacker.asp"
  end if
  % >
8.防止SQL注入

  1)过滤特殊字符;
  2)使用PreparedStatement防止sql注入

9.守好JavaBean的入口

  1)Bean必须对属性进行强制的访问控制
  2)谨慎使用<jsp:setProperty>的通配符
10.阻止未经认证访问受保护的JSP页面

  在J2EE中,可以利用Web容器中内置的安全技术来进行角色访问资源的控制。我们可以通过配置web.xml来控制角色访问,修改配置描述文件web.xml就可以达到快速修改安全策略的目的。
  安全限制允许使用编程的方法根据用户的角色来控制访问。资源可以被某些角色的用户访问,同时禁止其它的角色访问。另外,某个视图的一部分也可以根据用户的角色来限制其访问。如果某些资源完全不允许来自于浏览器的直接访问,那么这些资源可以配置只允许一些特殊的安全角色访问,而这些安全角色不分配给任何一个用户。这样只要不分配这个安全角色,那么以这种方式配置的资源将禁止所有的浏览器直接访问。
  1) 所有受保护的JSP页面都应该首先验证HttpSession中是否包含了用户名以确认当前用户是否已经登陆。如果HttpSession中包含了用户名,也就是说用户已经登陆,Web应用则将剩余的JSP页发送给浏览器,否则,JSP页将跳转到登陆页login.jsp。
  2) 阻止浏览器缓存
通过设置头信息和检查HttpSession中的用户名确保了浏览器不缓存页面,同时,如果用户未登陆,受保护的JSP页面将不会发送到浏览器。
选择刷新后前一个JSP页面将重新显示在浏览器中。很显然,这不是我们所想看到的因为它违背了logout动作的目的。发生这一现象时,很可能是一个恶意用户在尝试获取其他用户的数据。然而,这个问题仅仅出现在后退按钮对应的是一个处理POST请求的页面。
  3) 记录最后登陆时间

11.String对象隐患

如果密码是存储在 Java String 对象中的,则直到对它进行垃圾收集或进程终止之前,密码会一直驻留在内存中。即使进行了垃圾收集,它仍会存在于空闲内存堆中,直到重用该内存空间为止。密码 String 在内存中驻留得越久,遭到窃听的危险性就越大。更糟的是,如果实际内存减少,则操作系统会将这个密码 String 换页调度到磁盘的交换空间,因此容易遭受磁盘块窃听攻击。为了将这种泄密的可能性降至最低(但不是消除),您应该将密码存储在 char 数组中,并在使用后对其置零(String 是不可变的,无法对其置零)。

12.线程安全

JSP默认是以多线程方式执行的。以多线程方式执行可大大降低对系统的资源需求,提高系统的并发量及响应时间。线程在程序中是独立的、并发的执行路径,每个线程有它自己的堆栈、自己的程序计数器和自己的局部变量。虽然多线程应用程序中的大多数操作都可以并行进行,但也有某些操作(如更新全局标志或处理共享文件)不能并行进行。如果没做好线程的同步,在大并发量访问时,不需要恶意用户的“热心参与”,问题也会出现。最简单的解决方案就是在相关的JSP文件中加上: <%@ page isThreadSafe="false" %>指令,使它以单线程方式执行,这时,所有客户端的请求以串行方式执行。这样会严重降低系统的性能。我们可以仍让JSP文件以多线程方式执行,通过对函数上锁来对线程进行同步。一个函数加上synchronized 关键字就获得了一个锁。
13.网站管理口令安全策略。

①杜绝使用弱口令,以避免安全隐患,可以采用字母+数字+符号字符,并超过8位以上的密码。
②强制对所有用户密码加密,最好采用非对称加密或采用不可逆的运算,如使用32位的MD5码。
 

------解决方案--------------------
确实,实践项目很重要,有问题大家可以探讨下
------解决方案--------------------
url加密应该是需要自己做

这两个会帮你解码和编码URL传过来的参数据 
java.net.URLEncoder 
java.net.URLDecoder
---