系统中安全性是非常重要的,为了保证安全性很多解决方案被应用到系统中,比如架设防火墙防止数据库服务器直接暴露给外部访问者、使用数据库的授权机制防止未授权的用户访问数据库,这些解决方案可以很大程度上避免了系统受攻击,但是如果开发人员不注意SQL的安全性造成了SQL注入漏洞,那么所有的这些解决方案都形同虚设了,因为通过SQL注入漏洞,恶意访问者可以堂而皇之的对数据库进行任意操作,因为恶意访问者破坏数据库时所使用的一切操作都看起来是合法。我们来看一下什么是SQL注入漏洞。

到目前为止,本书演示的SQL语句都是静态的SQL语句,比如下面的SQL用于校验用户名为“admin”的用户的密码是否是“123456”,如果密码正确则PwdCorrect的值为true,否则为false:


SELECT (FPassword="123456") AS PwdCorrect FROM T_User WHERE FUser="admin" 在实际开发过程中一般是开发人员提供一个界面,允许用户输入用户名和密码,然后程序读取用户输入用户名和密码来构造SQL 语句来校验用户名和密码是否正确。实现的代码如下: string user=txtUser.getText(); string password = txtPassword.getText(); rs = ExuecuteQuery("SELECT (FPassword=""+password+"") AS PwdCorrect FROM T_User WHERE FUser=""+password+"""); if(rs.getBool("PwdCorrect ")==true) { ShowMessage("密码正确"); } else { ShowMessage("密码错误"); }

这里采用拼接字符串的方式根据用户录入的用户名和密码来构建SQL语句,如果用户名为“guest”,密码为“123456”,那么拼接出来的SQL语句如下:


SELECT (FPassword="123456") AS PwdCorrect FROM T_User WHERE FUser="guest"

这看起来是没有任何问题的,但是试想如果恶意攻击者在用户名输入框中随意输入一个“abc”,而在密码数据框中输入“1" or "1"="1”,那么拼接出来的SQL语句如下:


SELECT (FPassword="1" or "1"="1") AS PwdCorrect FROM T_User WHERE FUser="abc"

由于“"1"="1"”这个表达式永远返回true,而true与任何布尔值的or 运算的结果都是true,那么无论正确密码是什么“FPassword="1" or "1"="1"”的计算值永远是true,这样恶意攻击者就可以使用任何帐户登录系统了。十分惊讶吧!这样的漏洞就被称作“SQL注入漏洞(SQL

Injection)”。

对付SQL注入漏洞有两种方式:过滤敏感字符和使用参数化SQL。

最新文章

  1. Oracle研究专题:Oracle系统安装与配置
  2. ubuntu 16.04 + N驱动安装 +CUDA+Qt5 + opencv
  3. 你不得不知道的HTML5的新型标签
  4. undefined symbol libiconv_open 完全解决方案
  5. 第二十课:js中如何操作元素的属性系统
  6. mysql中文字段转拼音首字母,以及中文拼音模糊查询
  7. apache开源项目-- Usergrid
  8. in_array 判断问题的疑惑解决。
  9. linux自动备份文件和数据库并上传到指定的远程FTP中
  10. git push和git pull
  11. 解决IDEA Struts2 web.xml问题
  12. android小说阅读源码、bilibili源码、MVP新闻源码等
  13. 使用FFmpeg捕获一帧摄像头图像
  14. SQL反模式学习笔记20 明文密码
  15. JAVA基础复习与总结<二>构造方法_static关键字_final关键字
  16. python装饰器2:类装饰器
  17. Luogu P4479 [BJWC2018]第k大斜率
  18. Vue编译提示警告
  19. go微服务框架go-micro深度学习 rpc方法调用过程详解
  20. RabbitMQ入门介绍

热门文章

  1. CodeForces-757B Bash's Big Day
  2. java实现最大堆
  3. hnust py road
  4. lowercase calligraphic letters
  5. android 使用LruCache缓存网络图片
  6. FormsAuthentication类
  7. Charts & canvas & RGBA
  8. [AT2698] Don't Be a Subsequence
  9. 使用jdk中的java.sql包中的方法进行jdbc连接
  10. Lesson9 some interesting things in C#