作为一个真正的程序员,必须有高度的“安全意识”,因为我们作出的软件运行在复杂的环境中,不能把不该有异常抛给用户,更不能把漏洞留给“黑客”,当然也不能把“操作失误”作为系统出错的理由。
那么我们应该如何才能写出一个“安全”的软件呢?其实问题就在我们的程序旮旯中,看你是否用心去看哪些所有可能引起问题的代码。下面列举一例说明,我们的数据同步程序需要在目标数据库执行一点点(就一点点,你看下面的代码就知道)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{...} 不就好了吗?这只是掩盖了问题当并没有解决问题。
不要相信别人给你的任何输入”,谁知道这是仙女还是魔鬼呢?
安全问题无处不在,仔细检查一下你的程序旮旯,不要放过它,否则,你就可能后悔,“成功近在咫尺”却又“檫肩而过”。

隐藏在程序旮旯中的“安全问题”相关推荐

  1. vb中如何在任务管理器里面隐藏应用程序进程

    '该模块用于在任务管理器中隐藏进程 Private Const STATUS_INFO_LENGTH_MISMATCH = &HC0000004 Private Const STATUS_AC ...

  2. 【mac】如何在Mac系统Dock栏中插入空格/半透明隐藏应用程序

    [mac]如何在Mac系统Dock栏中插入空格/半透明隐藏应用程序/添加最近使用 Dock栏中插入空格 最近一些用户的 Dock 栏变得非常的酷,在应用程序之间,存在着一些空格,这样使得一些具有类似功 ...

  3. c语言实现进程隐藏和保护,C/C++程序开发中实现信息隐藏的三种类型

    无论是模块化设计,还是面向对象设计,还是分层设计,实现子系统内部信息的对外隐藏都是最关键的内在要求.以本人浅显的经验,把信息隐藏按照程度的不同分成(1)不可见不可用(2)可见不可用(3)可见可用. 1 ...

  4. nova launcher_如何使用Nova Launcher从Android的应用程序抽屉中隐藏应用程序

    nova launcher Not every app deserves a spot in your app drawer. Maybe there are some built-in apps y ...

  5. MAC 隐藏程序坞中JDK图标

    背景:idea启动Java程序的时候,程序坞中就会出现jdk图片,启动几个服务,就会出现几个图标,甚是烦人.服务多了,程序坞中就挤不下了.百度搜索了一大堆,都是没用的,最后在google中找到了解决办 ...

  6. 【Day10】项目中如何处理安全问题

    项目中如何处理安全问题 Web 前端安全 1. CSRF 跨站请求伪造 2. XSS 跨站脚本攻击 3. webshell 网站提权渗透 4. 网页挂马与流量劫持 5. 其他安全问题 6. 总结 We ...

  7. 深度学习框架中的魔鬼:探究人工智能系统中的安全问题

    ISC 2017中国互联网安全大会举办了人工智能安全论坛. 我们把论坛总结成为一系列文章,本文为系列中的第一篇. 深度学习引领着新一轮的人工智能浪潮,受到工业界以及全社会的广泛关注. 虽然大家对人工智 ...

  8. 隐藏在Win XP中的28个秘密武器

    隐藏在Win XP中的28个秘密武器 1.免费的系统教程(system32文件夹下) 安装完windows xp后很想马上学习并体验一下它的魅力吗?我们无需再东奔西走去找烦人的文字教材.只要选择&qu ...

  9. W7程序计算机面板介绍,win7系统隐藏任意程序运行界面的详细步骤

    win7系统使用久了,好多网友反馈说win7系统隐藏任意程序运行界面的问题,非常不方便.有什么办法可以永久解决win7系统隐藏任意程序运行界面的问题,面对win7系统隐藏任意程序运行界面的图文步骤非常 ...

最新文章

  1. git 下载 安装
  2. 软件工程需求设计说明书
  3. 蜜蜂实训平台c语言考试答案,北理c语言上机答案(全)
  4. 异步消息队列zeromq实现服务器间高性能通信
  5. 开发web前端_移动前端开发和web前端开发的区别?
  6. 傅里叶变换 直观_A / B测试的直观模拟
  7. JVM(一)史上最佳入门指南
  8. mysql is needed by_libnuma.so.1()(64bit) is needed by mysql-community-server-5.7.9-1.el6.x86_64
  9. linux定时监控端口并重新启动shell脚本命令
  10. red hat linux基本命令行,Red Hat Enterprise Linux4 一些常用命令总结
  11. warning:1071 (42000) Specified key was too long;max key length is 1000 bytes
  12. 站怎么点都是一样_搞笑段子:都说女人是水做的,你怎么不太一样
  13. Little endian和Big endian的区别
  14. tensorflow之tfrecord
  15. 常用Git客户端:Tower for Mac
  16. 【解决办法】hosts文件被劫持或者看不到办法
  17. python_07 函数作用域、匿名函数
  18. 6U VPX 超高速信号采集处理板(XC7K325T + 4 片DSP TMS320C6678)
  19. dell n5110 触摸板驱动
  20. 如何挑选蓝牙耳机,蓝牙参数说明

热门文章

  1. 解读:为什么要做特征归一化/标准化?
  2. MIT副教授赵宇飞团队登数学四大顶刊,华人作者中两位是本科生,最小的是00后...
  3. 大写的服!中科大博士写20万字论文:如何给女朋友送礼物
  4. 【干货】Github标星1.2K,Visual Transformer 最全最新资源,包含期刊、顶会论文
  5. 从清华退学,他赴美读博又两次退学!离开谷歌后,如今他怎样了?
  6. 涵盖18+ SOTA GAN实现,这个图像生成领域的PyTorch库火了
  7. 10 号发工资和 20 号发工资的公司,区别竟然这么大?
  8. 毕业使人头秃:发现自己的idea已经被人发表了,该怎么办?
  9. navicat无法连接远程的数据库解决
  10. Python给数字前固定位数加零或数字前置保留0