隐藏在程序旮旯中的“安全问题”
作为一个真正的程序员,必须有高度的“安全意识”,因为我们作出的软件运行在复杂的环境中,不能把不该有异常抛给用户,更不能把漏洞留给“黑客”,当然也不能把“操作失误”作为系统出错的理由。
那么我们应该如何才能写出一个“安全”的软件呢?其实问题就在我们的程序旮旯中,看你是否用心去看哪些所有可能引起问题的代码。下面列举一例说明,我们的数据同步程序需要在目标数据库执行一点点(就一点点,你看下面的代码就知道)SQL语句,按照原来的设计,这是不允许的,因为可能引起安全问题,但是现在既然“开了一扇窗”,就要“增加十层网”,我们来看看应该怎么样架起这个防火墙:
PWMIS.DataProvider.Data .AdoHelper db= this.GetDbHelper();
if (tableName == "TB_SYS_SQL")
{
foreach (EntityBase entity in entitys)
{
object obj = entity.PropertyList("sqlstr");
if (obj != null) //@1
{
string sqlstr = obj as string ;//@2
if (!string.IsNullOrEmpty(sqlstr)) //@3
{
//目前只执行该条类型的SQL语句
if (sqlstr.ToLower().StartsWith ("delete from jjzb")) //@4
{
int count = db.ExecuteNonQuery(sqlstr.Split (';')[0]);
//@5,过滤;号后的其它语句,避免SQL注入
this.Talk(string.Format("执行SQL语句{0} ,{1}行记录受影响。 ", sqlstr, count));
}
}
}
}
}
--------------------
我们来仔细分析上面的代码是怎么遵循“安全意识”的,
@1,先判断 obj 是否为空,如果不判断,下面的代码就可能出错;
@2,将 变量 obj 转换成一个字符串对象,如果使用下面的方式转换,有可能出现错误:
string sqlstr=(string)obj;
当然还有其它安全的转换方式,大家可以去找找看;
@3,转换可能不成功,需要再此判断字符串对象是否为空引用或者空字符串,否则下面的查询会出错;
@4,sqlstr.ToLower(),确保它可以和后面的字符串比较,避免大小写问题;
@5,sqlstr.Split(';') 这句将输入的SQL字符串进行拆分,为什么要这样做?我们看看加入它的值是下面的 SQL语句会在呢么样:
delete from jjzb where jjdm='KF001' ;drop table tb_user--
如果有人哪天输入了这样的一条语句,那DBA或者系统管理员就该哭死了,sqlstr.Split(';')[0] 确保程序只会执行分号前面的SQL语句(该语句在步骤4已经确保安全了),从而不会有SQL注入的问题。
也许有人说了,这些SQL语句是我用后台管理工具输入的,很安全,可以确保没有问题,不用这么麻烦来判断吧?也许你只输入了一个空格,也许你的数据在传输过程中被黑客截获... ...
也许,你也会说,加一个 try{...}catch{...} 不就好了吗?这只是掩盖了问题当并没有解决问题。
“不要相信别人给你的任何输入”,谁知道这是仙女还是魔鬼呢?
安全问题无处不在,仔细检查一下你的程序旮旯,不要放过它,否则,你就可能后悔,“成功近在咫尺”却又“檫肩而过”。
- 深度学习系列(2):前向传播和后向传播算法
- 未来5年,什么样的人最抢手
- 腾讯AI Lab俞栋:AI的发展需要合作伙伴一起AI in ALL
- NLP+2vec︱认识多种多样的2vec向量化模型
- 深度学习数据集(一)
- 将Spring Boot应用程序部署到Bluemix
- Opencv学习(一)——安装配置遇到的问题
- The .NET of Tomorrow
- 国内自动驾驶企业在美国首秀其最新L4级自动驾驶货运卡车
- Nginx源码安装及调优配置
- Greenplum 简单性能测试与分析
- CentOS6 安装couchdb2 集群
- 如何遍历维数和各维上限未定的多维数组
- 求长度的另一种方法(""+obj).Length
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- ggplot2|发散性“正负”图
- R语言蒙特卡洛计算和快速傅立叶变换计算矩生成函数
- pheatmap|暴雨暂歇,“热图”来袭!!!
- 统一服务消息接口报48001错误
- ggplot2|ggpubr进行“paper”组图合并
- PostgreSQL drop table 空间不释放的问题解决
- R语言预测人口死亡率:用李·卡特模型、非线性模型进行平滑估计
- Dockerfile 指令
- Docker 构建容器Tomcat+Nginx+MySQL
- 三种动态控制SAP CRM WebClient UI assignment block显示与否的方法
- TCGA数据库中癌症名称缩写
- CloudFlare自定义节点优化网站
- 什么是SSL?为什么要为WordPress网站使用SSL?
- R语言再保险合同定价案例研究
- SAP CRM附件的技术属性设计原理