博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
隐藏在程序旮旯中的“安全问题”
阅读量:6528 次
发布时间:2019-06-24

本文共 1627 字,大约阅读时间需要 5 分钟。

    作为一个真正的程序员,必须有高度的“
安全意识”,因为我们作出的软件运行在复杂的环境中,不能把不该有异常抛给用户,更不能把漏洞留给“黑客”,当然也不能把“操作失误”作为系统出错的理由。
    那么我们应该如何才能写出一个“安全”的软件呢?其实问题就在我们的程序旮旯中,看你是否用心去看哪些所有可能引起问题的代码。下面列举一例说明,我们的数据同步程序需要在目标数据库执行一点点(
就一点点,你看下面的代码就知道)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{...} 不就好了吗?这只是掩盖了问题当并没有解决问题。
不要相信别人给你的任何输入”,谁知道这是仙女还是魔鬼呢?
安全问题无处不在,仔细检查一下你的程序旮旯,不要放过它,否则,你就可能后悔,“成功近在咫尺”却又“檫肩而过”。
    本文转自深蓝医生博客园博客,原文链接:http://www.cnblogs.com/bluedoctor/archive/2012/01/20/2327985.html,如需转载请自行联系原作者
你可能感兴趣的文章
Jmockit使用
查看>>
I.MX6 Android mmm convenient to use
查看>>
[CareerCup] 13.9 Aligned Malloc and Free Function 写一对申请和释放内存函数
查看>>
Stack and Heap 堆和栈的区别
查看>>
什么是 A 轮融资?有 B轮 C轮么?
查看>>
55、Android网络图片 加载缓存处理库的使用
查看>>
[AlwaysOn Availability Groups]AG扩展事件
查看>>
svn文件提交时强制写注释
查看>>
【转载】千万级规模高性能、高并发的网络架构经验分享
查看>>
jsp字段判空
查看>>
OC基础--OC中的类方法和对象方法
查看>>
ubuntu samba服务器多用户配置【转】
查看>>
母线的种类与作用是什么(转)
查看>>
【Xamarin 挖墙脚系列:IOS 开发界面的3种方式】
查看>>
Atitit.工作流系统的本质是dsl 图形化的dsl 4gl
查看>>
I.MX6 Android USB Touch eGTouchA.ini文件存放
查看>>
4-5-创建索引表-串-第4章-《数据结构》课本源码-严蔚敏吴伟民版
查看>>
java 操作 RabbitMQ 发送、接受消息
查看>>
Oracle 12C 新特性之 db默认字符集AL32UTF8、PDB支持不同字符集
查看>>
Linker Special Section Types
查看>>