安全性检验与异常抛出

本文讨论了在软件开发中输入验证的重要性,特别是针对数字输入的数据类型检查。通过一个具体例子,探讨了如何避免因输入验证不足导致的安全隐患,并提出了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

         这段代码的作用是检验字符串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;
                   }
                 
         }
       
         问题其实很简单,写出来的目的,只是要让自己印象深刻点,要时刻把自己当成独挡一面的技术人员,那么,安全问题当然就不是小问题啦!
 
### 关于异常处理中的抛出捕获 在编程中,异常处理是一种重要的机制,用于应对运行时可能出现的错误情况。以下是关于如何正确抛出捕获异常的具体说明以及代码示例。 #### 正确抛出异常 在许多现代编程语言(如 Kotlin C++)中,可以通过 `throw` 或类似的语句显式地抛出异常。这通常发生在检测到无法正常处理的情况时。例如,在函数内部遇到非法参数或逻辑错误时可以抛出异常[^1]。 对于自定义异常,开发者可以根据需求创建特定类型的异常类,并从中派生新的异常类型。这样做的好处是可以更精确地标记不同种类的错误状态[^3]。 ```kotlin // 定义一个简单的自定义异常类 class InvalidInputException(message: String?) : Exception(message) fun validate(input: Int) { if (input < 0) { throw InvalidInputException("输入值不能小于零") // 抛出自定义异常 } } ``` 上述例子展示了如何在一个名为 `validate` 的方法里实现基本验证功能。如果传入负数,则会触发该异常。 #### 捕获并处理异常 为了使应用程序更加健壮稳定,应当合理设计异常捕捉流程。一般情况下,使用 `try-catch` 结构包裹可能会引发异常的操作区域。一旦发生预期内的异常事件,控制流就会跳转至相应的 `catch` 块继续执行后续操作而不是终止整个进程[^2]。 下面是一个完整的 Koltin 示例,展示当调用可能失败的方法时该如何安全地管理这些风险: ```kotlin fun main() { val input = -5 try { validate(input) println("验证成功") } catch(e: InvalidInputException){ System.err.println("捕获到了InvalidInputException: ${e.message}") } finally{ println("无论是否出现异常都会被执行的部分") } } // 上述提到过的校验函数 fun validate(input: Int) { if (input < 0) { throw InvalidInputException("输入值不能小于零") } } ``` 在这个案例中,我们不仅实现了基础的功能测试还加入了额外的日志记录以便调试分析之用。另外值得注意的是最后那个无论如何都要运行一次的特殊区块——即所谓的 `finally` 子句^。 #### 继承关系下的多态特性应用 考虑到某些场景下可能存在多种潜在问题类别需要分别对待的情形,此时利用面向对象原则里的继承概念就显得尤为重要了。比如上面提及过有关大小方面的特殊情况可以用专门针对此类别的子类表示出来;而其他通用型则统一由父级负责接管: ```cpp #include <iostream> using namespace std; struct BaseException {}; struct DerivedA : public BaseException {}; struct DerivedB : public BaseException {}; void riskyFunction(bool flag) { if(flag) throw DerivedA(); else throw DerivedB(); } int main(){ try{ bool condition=true; riskyFunction(condition); }catch(const BaseException& ex){ // 单一入口点简化复杂度 cerr << "An exception occurred."<<endl; } return 0;} ``` 这里通过单一基类作为接收器的方式减少了重复劳动同时也提高了可维护性.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值