我一向对这方面都不怎么看重的,觉得技术上掌握了,其他细节当然就不是问题。感谢YC师兄,昨天的一番话让我印象深刻,也让我收益菲浅!
如果自己做的东西很小,不成规模,那还没什么。但是,如果应用范围广,受益群体大,那安全问题就不得不作为一个方面来考虑。今天查了这方面的资料,我的天,还真的有这样的案例。黑客居然可以根据打印在jsp页面上的错误信息攻入服务器~怕怕。
话题扯远了。
我之前做的几个页面都没有进行相应的安全性检验,比如说数据类型检验,长度检验,必填项检验。当然了,这些或许不会对系统安全性造成什么损害,但是,对于可能存在的破坏性行为,作为搞技术的,当然要提前杜绝!
说到数据类型检验,今天这个小小的问题也搞了我一天。
Hrv检查页面有一输入框,要求用户输入相应的心率值(HeartRate).但是,经过我测试,我随便输入几个字母,竟也能保存!
FormBean里HeartRate的定义是这样的:
Private Double heartRate;
Private Double heartRate; 而系统里已经有前人做好的数字检验代码:

public static boolean vldNumber(BaseException exp, String value, String arg) ...{
if (StringUtil.validStr(value) == null)
return true;

try ...{
Double.parseDouble(value);

} catch (Exception th) ...{
String arg1 = "只能填写数字";
exp.addErrMsg(new ActionMessage("errors.invalid2", arg, arg1));
return false;
}
return true;
}

public static boolean vldNumber(BaseException exp, String value, String arg) ...{
if (StringUtil.validStr(value) == null)
return true;
try ...{
Double.parseDouble(value);
} catch (Exception th) ...{
String arg1 = "只能填写数字";
exp.addErrMsg(new ActionMessage("errors.invalid2", arg, arg1));
return false;
}
return true;
}
这段代码的作用是检验字符串value的组成元素是不是都是数字。本来已经很简单,拿来就可以用。
ApplicationException exp = new ApplicationException();
ValidationUtil.vldNumber(exp,form.getHeartrate().toString(),"心率"); 问题出来了, 他一直抛出nullPointerException 的异常,怎么回事呢?通过单步调试才发现,原来,当Jsp页面心率输入框输入非数字内容的时候,form.getHeartrate()返回的值居然是NULL,难怪会抛出这样的异常!没办法,只能自己写检验代码!
首先,数据类型的检验,我直接用了instanceof!非常简单,非常方便!
其实,一旦发现数据类型不符合,马上用throw抛出我的异常!
代码如下:
public void vldNumber(Object value) throws ApplicationException
...{
if(value instanceof Double)
...{
System.err.println("类型正确");
}
else
...{
System.err.println("类型不正确");
ApplicationException exp = new ApplicationException();
exp.addErrMsg(new ActionMessage("errors.invalid2", "输入","只能输入数字"));
throw exp;
}
} 
问题其实很简单,写出来的目的,只是要让自己印象深刻点,要时刻把自己当成独挡一面的技术人员,那么,安全问题当然就不是小问题啦!
本文讨论了在软件开发中输入验证的重要性,特别是针对数字输入的数据类型检查。通过一个具体例子,探讨了如何避免因输入验证不足导致的安全隐患,并提出了解决方案。

被折叠的 条评论
为什么被折叠?



