电信主站 网通分站
购买流程 付款方式 常见问题 在线提问 续租服务 购物车
用户名: 密 码: 忘记密码?
首 页
域名注册
虚拟主机
双线主机
服务器租用
VPS主机
企业邮局
代理专区
客服中心
虚拟主机行业资讯 虚拟主机评测对比 互联网最新动态 技术学院 站长资讯 在线教程 网站运营
搜索优化 服务器 网络编程 图形图象 站长之家 网页制作 操作系统
冲浪宝典 软件教学 视频通信 办公软件 邮件系统 网络安全 认证考试
您当前位置:西部数码->资讯中心-> 在线教程-> JSP教程
JSP安全编程实例浅析(中级)2-JSP教程,Jsp/Servlet
作者:网友供稿 点击:5
  西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!虚拟主机可在线rar解压,自动数据恢复设置虚拟目录等.虚拟主机免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金!
文章页数:[1] 

四、时刻牢记sql注入

一般的编程书籍在教初学者的时候都不注意让他们从入门时就培养安全编程的习惯。著名的《jsp编程思想与实践》就是这样向初学者示范编写带数据库的登录系统的(数据库为mysql):

statement stmt = conn.createstatement();
string checkuser = "select * from login where username =
"+ username +"and userpassword = "+ userpassword +"";
resultset rs = stmt.executequery(checkuser);
if(rs.next())
response.sendredirect("successlogin.jsp");
else
response.sendredirect("failurelogin.jsp");



这样使得尽信书的人长期使用这样先天“带洞”的登录代码。如果数据库里存在一个名叫“jack”的用户,那么在不知道密码的情况下至少有下面几种方法可以登录:
用户名:jack
密码: or a=a
用户名:jack
密码: or 1=1/*
用户名:jack or 1=1/*
密码:(任意)

lybbs(凌云论坛)ver 2.9.server在loginout.java中是这样对登录提交的数据进行检查的:

if(s.equals("") ││ s1.equals(""))
throw new userexception("用户名或密码不能空。");
if(s.indexof("") != -1 ││ s.indexof("\"") != -1 ││ s.indexof(",") != -1 ││ s.indexof("\\") != -1)
throw new userexception("用户名不能包括 \" \\ , 等非法字符。");
if(s1.indexof("") != -1 ││ s1.indexof("\"") != -1 ││ s1.indexof("*") != -1 ││ s1.indexof("\\") != -1)
throw new userexception("密码不能包括 \" \\ * 等非法字符。");
if(s.startswith(" ") ││ s1.startswith(" "))
throw new userexception("用户名或密码中不能用空格。");



但是我不清楚为什么他只对密码而不对用户名过滤星号。另外,正斜杠似乎也应该被列到“黑名单”中。我还是认为用正则表达式只允许输入指定范围内的字符来得干脆。

这里要提醒一句:不要以为可以凭借某些数据库系统天生的“安全性”就可以有效地抵御所有的攻击。pinkeyes的那篇《php注入实例》就给那些依赖php的配置文件中的“magic_quotes_gpc = on”的人上了一课。

五、string对象带来的隐患

java平台的确使安全编程更加方便了。java中无指针,这意味着 java 程序不再像c那样能对地址空间中的任意内存位置寻址了。在jsp文件被编译成 .class 文件时会被检查安全性问题,例如当访问超出数组大小的数组元素的尝试将被拒绝,这在很大程度上避免了缓冲区溢出攻击。但是,string对象却会给我们带来一些安全上的隐患。如果密码是存储在 java string 对象中的,则直到对它进行垃圾收集或进程终止之前,密码会一直驻留在内存中。即使进行了垃圾收集,它仍会存在于空闲内存堆中,直到重用该内存空间为止。密码 string 在内存中驻留得越久,遭到窃听的危险性就越大。更糟的是,如果实际内存减少,则操作系统会将这个密码 string 换页调度到磁盘的交换空间,因此容易遭受磁盘块窃听攻击。为了将这种泄密的可能性降至最低(但不是消除),您应该将密码存储在 char 数组中,并在使用后对其置零(string 是不可变的,无法对其置零)。

六、线程安全初探

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

public class myclass{
int a;
public init() {//此方法可以多个线程同时调用
a = 0;
}
public synchronized void set() {//两个线程不能同时调用此方法
if(a>5) {
a= a-5;
}
}
}



但是这样仍然会对系统的性能有一定影响。一个更好的方案是采用局部变量代替实例变量。因为实例变量是在堆中分配的,被属于该实例的所有线程共享,不是线程安全的,而局部变量在堆栈中分配,因为每个线程都有它自己的堆栈空间,所以这样线程就是安全的了。比如凌云论坛中添加好友的代码:

public void addfriend(int i, string s, string s1)
throws dbconnectexception
{
try
{
if……
else
{
dbconnect dbconnect = new dbconnect("insert into friend (authorid,friendname) values (?,?)");
dbconnect.setint(1, i);
dbconnect.setstring(2, s);
dbconnect.executeupdate();
dbconnect.close();
dbconnect = null;
}
}
catch(exception exception)
{
throw new dbconnectexception(exception.getmessage());
}
}



下面是调用:

friendname=parameterutils.getstring(request,"friendname");
if(action.equals("adduser")) {
forumfriend.addfriend(integer.parseint(cookieid),friendname,cookiename);
errorinfo=forumfriend.geterrorinfo();
}



如果采用的是实例变量,那么该实例变量属于该实例的所有线程共享,就有可能出现用户a传递了某个参数后他的线程转为睡眠状态,而参数被用户b无意间修改,造成好友错配的现象。


文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关主题
文章页数:[1] 
Google
热门文章
·IReport与JasperReport开发详解一-JSP教程,Java技巧及代码
·JSTL(JSP标准标签库)介绍-JSP教程,资料/其它
·格式化输入日期时间控件 JieFormattedDateBox-JSP教程,Java技巧及代码
·JSTL简化JSP编码-JSP教程,Jsp/Servlet
·JUnit和单元测试入门简介-JSP教程,Java技巧及代码
·从数据库中读取一个图片并保存为一个图片文件-JSP教程,数据库相关
·Java Swing入门基础-JSP教程,Java技巧及代码
·IntelliJ IDEA培训-JSP教程,Java技巧及代码
·通过JSP的预编译消除性能瓶颈-JSP教程,Jsp/Servlet
·Java中利用JMF编写摄像头拍照程序-JSP教程,Java技巧及代码

最新文章
·J2ME中的时间处理方法
·J2ME播放声音流程简介
·J2ME开发之手机键盘使用注意问题
·J2ME 记录管理存储
·MVC模式在j2me项目中的应用(二)
·MVC模式在j2me项目中的应用(一)
·J2ME中使用记录存储系统(RMS)存储信息
·J2ME与MIDP开发(1)
·用简单的J2ME程序测试MIDlet的生命周期
·JAVA基础:提升JSP应用程序的七大绝招


 
 


版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
  打印  刷新  关闭
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 虚拟主机 | 资讯中心 | 友情链接 | 网站地图

版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2006 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86262244 86263048 86263408 86263960 86264018 86267838
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028-86264041 财务QQ:点击发送消息给对方635483282
售前咨询QQ:点击发送消息给对方2182518 点击发送消息给对方241975952 点击发送消息给对方275026793 点击发送消息给对方408235859
售后服务QQ:点击发送消息给对方17708515 点击发送消息给对方307742704 点击发送消息给对方287976517 点击发送消息给对方363783715
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号