作者: 阙荣文 ( querw )

什么是SQL注入攻击,有什么危害

先来看一个例子说说SQL注入攻击是怎么回事,有什么危害.

在有用户参与的网站中,所有操作中最重要的就是登录.要求用户输入用户名和密码,然后在数据库里校验输入的有效性.
我相信很多人(反正我以前一直就是怎么写的)写类似下面的代码:

(代码1)
string strUserName = txtUserName.Text;
string strPwd = txtPwd.Text;
string strSql = "select * from UserTable where username = ";
strSql += "'" + strUserName "'";
strSql += " and password ='" + strPwd + "'";
...

像这样依赖用户输入来"拼凑"SQL语句的代码是极其脆弱的. 假设一个用户(也许是黑客)输入的密码是 ' or '1'='1 用户名无所谓什么字符,看看这条SQL语句会变成什么:

select * from UserTable where username = 'what ever you input' and password = '' or '1'='1'

执行这个语句会返回整个UserTable表,再加上很多网站的管理账号的用户名就是 admin, 那么悲剧的发生就无法避免了,入侵者很容易就以管理员的身份登录了,不管你的密码设置得多长,多复杂. 事实上入侵者能够利用上述的漏洞获取到远远比你想象的多的信息,如果他精通SQL的话,整个网站都有可能变成他的玩具. 所谓SQL注入攻击,大概就是这个意思了.SQL注入攻击使用正常的WEB浏览工具,防火墙对此无能为力,而且现成的攻击工具很多,使用也简单.如果网站存在这样的漏洞的话,任何一个人都有可能轻松攻破你的网站.

如何防范?
在网上随便搜一下,就可以得到 "通用防注入" 代码,它的原理是检查访问者提交的(包括使用GET 和 POST方法)数据,如果内容里含有某些SQL敏感的单词,则采取相应的防范措施. 比如某个"通用防注入"的关键字字典是: '|exec|insert|select|delete|update|count|chr|truncate|char|declare|--|script|*|char|set|(|) 所有提交的内容中含有上述任何一个单词,都被认为是攻击尝试.

不可否认这是一个解决方案,但我认为这只是治标不治本,理由:
1. 打击面过大,比如博客/新闻网站,用户的提交包含上面的单词是很正常的,但是如果过滤的话会被认为是入侵行为.
2. 没有从根本上解决问题,黑客技术的发展非常快,所谓道高一尺,魔高一丈.这个关键字字典也许永远都没办法包含所有危险的关键字.

解决问题要找根本,SQL注入漏洞的根源在于直接用访问者的输入 "拼凑" SQL语句并执行.那就不要拼凑SQL语句了 - 使用参数或者存储过程. 通过参数或者存储过程,SQL语句受开发者/管理员控制,用户的输入被限制在特定作用范围,就好像被笼子关着的野兽,牙齿再尖利,也咬不到笼子外的东西.

(代码2)
string strSql = "select * from UserTable where UserName = @UserName and Password = @Password";
SqlParameter[] param = new SqlParameter[]
{
      new SqlParameter("@UserName", strName),
      new SqlParameter("@Password", strPwd)
};
DataSet ds = db.OpenDataSetS(strSql, param);
...

现在,不管入侵者提交什么用户名或者密码,都被作为 @UserName 和 @Password 的值传给数据库引擎,而不在影响SQL语句本身.

另外提一句,适当做一些过滤总是有好处的. 比如这么一个链接 http://xxxx/userdetail.aspx?userid=100001
服务器页面会用Request的QueryString方法(或者类似的方法,本文的写作背景是ASP.NET / C# / SQL Server 2005)获取userid的值,如果直接把userid作为SQL语句的一部分,那么就会造成一个SQL注入漏洞. 但是这里很明显,userid是一个数值,如果使用前总是先把字符串转成数值型,那么就可以避免攻击.还有很多类似的地方,比如一般都有规定用户名的最长字符数,再接到访问者输入时可以检查一下. 总而言之,在逻辑上做一些检测会使程序更加严谨,错误可控.

后记
笔者的网站就经历过SQL注入攻击,之前全部采用"拼凑"SQL语句的方式写代码,给了我一个惨痛的教训.网站被安装shell,重要邮箱被盗(邮箱密码和网站admin密码设置成一样了,另一个惨痛教训.)
域名被修改.(域名密码和admin密码也设置成一样了,捶胸顿足...) 还好,最后"黑客"同志看在我们都是同胞弟兄的份上,把密码都换给我了. 被狠狠的上了一课. 感谢他的好心,如果碰到一个有恶意的攻击者...无法想象.

另外,我在网上搜索发现一种说法:使用参数并不能绝对杜绝SQL注入攻击,不过也没说出个所以然.我也不是很明白,如果您知道,能否告诉我一下(querw@sina.com)?非常感谢.

附录: 代码2中OpenDataSetS()函数

public System.Data.DataSet OpenDataSetS(string strSql, SqlParameter[] param)
    {
        // 判断连接字符串是否为空.
        if (!Open()) return null;

        DataSet ds = null;
        SqlDataAdapter da = new SqlDataAdapter();
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = " *** my sql connection string ***";
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = strSql;

          if (param != null)
          {
              foreach (SqlParameter p in param)
              {
                  cmd.Parameters.Add(p);
              }
          }
        da.SelectCommand = cmd;

        ds = new DataSet();
        da.Fill(ds);

        cmd.Dispose(); cmd = null;
        da.Dispose(); da = null;
        return ds;
    }

Godaddy服务器上关于ASP.NET网站建设一些经验 - 防SQL注入攻击(三)相关推荐

  1. 网站漏洞修复方案防止SQL注入攻击漏洞

    SQL注入漏洞在网站漏洞里面属于高危漏洞,排列在前三,受影响范围较广,像asp..net.PHP.java.等程序语言编写的代码,都存在着sql注入漏洞,那么如何检测网站存在sql注入漏洞? SQL注 ...

  2. 如何防止网站被SQL注入攻击之java网站安全部署

    SQL注入攻击(SQL injection)是目前网站安全以及服务器安全层面上是最具有攻击性,危害性较高,被黑客利用最多的一个漏洞,基本上针对于网站代码,包括JAVA JSP PHP ASP apac ...

  3. 图片服务器上图片的管理网站上传与前台显示

    图片服务器上图片的管理网站上传与前台显示 代码简介:  很实用的一个图片上传得例子 图片上传:生成缩略图 加文字水印 图片水印 51aspx.png为水印图片 远程图片抓取(保存到本地)支持jpg.g ...

  4. Linux常用命令下,以及再CentOS7下搭建apache网站服务,以及同一服务器上搭建第二个网站

    Linux常用命令下,以及再CentOS7下搭建apache网站服务,以及同一服务器上搭建第二个网站 Linux 常用命令ls -l 以长格式显示-a 显示.. 和 .-A 不显示 . 和 ..-d ...

  5. 在一台服务器上搭建多个网站的方法(Apache版)

    Apache的配置文件一般放置在/etc/httpd/conf文件夹下,httpd.conf是它的主配置文件,在进行配置时可以将虚拟主机的配置文件单独配置,如取名为vhost.conf,然后再http ...

  6. 在一台服务器上搭多个网站的解决方案

    以前一直困惑于80端口就一个,如何才能在一台服务器上布署多个网站呢?最近因为公司服务器需要实现这个需求,才去认真的研究其中的原理与布署方案,本文总要记录winodws服务器下apache与iis的配置 ...

  7. 国内服务器不备案可以挂网站吗,国内服务器上放置的所有网站都必须备案

    国内服务器上放置的所有网站都必须备案 根据2005年信产部(现为工信部)发布的<互联网信息服务管理办法>(以下简称<办法>)规定,在国内服务器上放置的所有网站都必须备案,且办理 ...

  8. ASP.NET网站防止SQL注入攻击

    目的: 对输入的字串长度,范围,格式和类型进行约束. 在开发 ASP.NET 程序时使用请求验证防止注入攻击. 使用 ASP.NET 验证控件进行输入验证. 对不安全的输出编码. 使用命令参数集模式防 ...

  9. SQL注入攻击再度肆虐殃及大量网站

    据研究人员称,上周一个自动SQL注入攻击劫掠了超过70,000个美国网站,并顺带攻击了访问这些网站的大量PC机用户.通过Google可以很容易搜索到受攻击的网站,网页内容千差万别,包括教育网和政府网域 ...

最新文章

  1. mysql navicat导入bcp_SQL Server中BCP导入导出用法详解
  2. android mp4宽高,Android:MediaPlayer视频宽高比问题
  3. 余承东没有吹牛:华为首次超越三星,成为全球最大手机供应商
  4. 百年名校史上第一桩:博士论文抄袭,剥夺学位,涉事中国学者已在国内教书7年...
  5. Win10系统下安装VC6.0教程
  6. 计算机键盘是编码键盘还是非编码键盘,矩阵按键原理图_矩阵按键扫描实例
  7. linux下防火墙加白名单
  8. 参数化的JUnit测试
  9. 线程基础阶段性总结和扩展(二)——ThreadLock
  10. NLP的两种工具的java版使用:复旦FudanNLP,中科院计算所ICTCLAS2013
  11. 原生js自定义提示框
  12. html特殊符号输入法,特殊符号键盘输入法
  13. ENSEMBLE DISTILLATION APPROACHES FOR GRAMMATICAL ERROR CORRECTION翻译
  14. 【python爬虫】喜欢看小说又手头紧的小伙伴一定要看这篇文章,带你一步步制作一个小说下载器
  15. 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!(dij+bitset)
  16. 使用Matlab求解矩阵方程的解
  17. sign in 与 log in ;登陆与登录
  18. Java Scanner常用用法
  19. 静态网页与动态网页的区别
  20. 系统集成项目管理之项目成本管理(EV AC PV CV SV)

热门文章

  1. 网页上添加聊天工具代码
  2. 127.0.0.1:3000端口已被占用
  3. Recovery HBOOT SPL RADIO APP2SD 金卡
  4. ASUS Vivobook archlinux声卡驱动
  5. [读书笔记]-博恩·崔西-吃掉那只青蛙
  6. (00XX系列)抽抽Windows宽字符的棉絮(附日志文件源码)
  7. SpringBoot 监控
  8. 升级到win11后VMware不能开启虚拟机了
  9. 智能优化算法之蚁群算法(ACO)
  10. 一种喷涂有可吸收电磁波的水性油漆的飞机外壳