sql注入主要是指通过在get、post请求参数中构造sql语句,以修改程序运行时所执行的sql语句,从而实现获取、修改信息甚至是删除数据的目的,sql被注入的原因主要是代码编写的有问题(有漏洞),只要平时注意在编写与sql相关的代码时养成良好的习惯,对可能被注入的sql语句加以防范,那么在大部分情况下是可以防范sql注入的。下面看下哪些不好的编码习惯容易引起select语句被注入,并分析下防范措施。

注意:这里没有完整的php代码,可以大致假设一个场景:用户可以通过类似下面的url地址http://localhost/user.php?username=yang或http://localhost/user.php?uid=yang,通过get方法来请求数据库中的信息,数据库中有user、article表。

1,sql语句中的替换变量不加引号
看下这条语句 $sql = "select uid, username from user where uid = $uid "; 
替换变量不加引号,如果用户输入这样的$uid:$uid = '1 and 1=2 union select * from article where aid = 1';

那么可以构造出这样的sql

select uid, username from user where uid =  and = union select * from article where aid = 

可以看到结合union,就可以对其他表中的数据进行查询。

所以,sql语句中的变量应该要加上引号 $sql = "select uid, username from user where uid = '$uid'"; 
这样即便被sql注入,被构造的sql语句也只会变成这样:

select uid, username from user where uid = '1 and 1=2 union select * from article where aid = 1';

这样构造出的uid就只能是sql语句中查询参数的值,也就起不到注入作用了。

2,未对用户的输入进行过滤和转义

(1)过滤,对数据进行过滤,将其转换为自己需要的格式,或者判断数据格式是否合法。判断数据格式是否合法这个要按照自己定义的规则来进行,比如email地址格式、用户名长度和组合、密码长度和组合等,这里先不讨论数据格式合法性的问题。下面先简单看下格式转换问题:

对于按id查找的sql,因为id一般为整数,所以可以先将用户输入的数据类型转换为int,这样即使用户尝试构造$uid为:

$uid = (int)'1 and 1=2 union select * from article where aid = 1' ,

它也会被转换为数字,这在一定程度上能够避免被注入。

(2)对于按如username字符串类型查找的sql,面临的主要注入风险是通过在参数中加上单引号、sql注释符、sql语句结束符等符号来构造sql,所以只要注意将这些字符进行转义即可,也就是对用户输入的数据进行转义,这里涉及到两个函数:addslashes()和 addcslashes()。addslashes()可以对单引号'、双引号"、反斜线\和NUL(NULL字符)进行转义。addcslashes()可以自定义需要转义的字符,下面来看下利用addcslashes()对用户的输入进行转义。

比如下面这条sql语句:

$sql = "select uid, username from user where username = '{$username}' ";

在不进行转义的时候,用户可以构造$username如下: yang';SHOW TABLES-- inject 
最后构造出如下的sql:

select uid, username from user where username = 'yang';SHOW TABLES-- inject';

现在我们用addcslashes()函数对$username进行转义,

$username = isset($_GET['username']) ? addcslashes($_GET['username'], "'\"%_\\;-") : '';

注意上面的语句会对下面的字符进行转义 ,可以根据实际需要转义相应的字符。

' 单引号
" 双引号
% 百分号
_ 下划线
\ 反斜线
; 分号
- 小破折号

这时如果用户构造的 yang';SHOW TABLES-- inject 就会变成这个样子: yang\'\;SHOW TABLES\-\- inject ,构造的sql会变成这样:

select uid, username from user where username = 'yang\'\;SHOW TABLES\-\- inject';

可以说是惨不忍睹了,sql注入也就失效了。

3,小结

上面只是简单的分析了容易被sql注入的两个不好的编程习惯和相应的防范,其实sql注入的方式、方法还有很多,所谓魔高一尺、道高一丈,需要学习的地方还有很多。

 参考:

php程序设计

Web安全之SQL注入攻击技巧与防范

php web开发安全之sql注入和防范:(一)简单的select语句注入和防范的更多相关文章

  1. WEB开发中一些常见的攻击方式及简单的防御方法

    WEB开发中一些常见的攻击方式及简单的防御方法 转载:http://blog.csdn.net/seven__________7/article/details/70896913

  2. web开发中防止SQL注入

    一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库. 二.SQL注入攻击的总体 ...

  3. 基于SQL和PYTHON的数据库数据查询select语句

    #xiaodeng#python3#基于SQL和PYTHON的数据库数据查询语句import pymysql #1.基本用法cur.execute("select * from biao&q ...

  4. Web安全篇之SQL注入攻击

    在网上找了一篇关于sql注入的解释文章,还有很多技术,走马观花吧 文章来源:http://www.2cto.com/article/201310/250877.html ps:直接copy,格式有点问 ...

  5. Java应用开发中的SQL注入攻击

    1. 什么是SQL注入攻击? SQL注入攻击是黑客对数据库进行攻击的常用手段之一.随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员越来越多.但是由于程序员的水平及经验参差不齐,相当一部分 ...

  6. Web开发技术的演变

    原文出处: WildFly   欢迎分享原创到伯乐头条 受到好文<Web开发的发展史>(英文)激发的灵感,写下我对web开发技术的认识. 1. 静态页面时代 大学时候,上机还得换卡穿拖鞋, ...

  7. Python做web开发,推荐几个能立马上手的小项目

    Python这门优美的语言是非常适合web开发的,基于Python的Django框架简单便捷且很强大. 那么作为新手该如何上手这门语言?一切不敲代码的学编程手段都是扯淡,今天就推荐一些适合新手练手的P ...

  8. 转Web开发的发展史---Web开发技术的演变

    转自:http://blog.csdn.net/zzzkk2009/article/details/9849431 在接下来的几个月时间里,我打算写一系列关于完整web开发的文章.这第一篇文章虽然有所 ...

  9. web开发中目录路径问题的解决

    web开发当中,目录路径的书写是再常用不过了,一般情况下不会出什么问题,但是有些时候出现了问题却一直感到奇怪,所以这里记录一下,彻底解决web开发中路径的问题,开发分为前端和服务端,那么就从这两个方面 ...

随机推荐

  1. Date类型错误

    今天写代码的时候遇到一个很蛋疼的问题,明明实体类写的是Date型,文本框也是date型,数据库中对应的列是dateTime类型,这原本进行数据录入或者是修改这个操作是不应该出错的,但是一时没找到解决的 ...

  2. 鼠标悬浮控制元素隐藏与显示 - css中鼠标的hover状态

    需求:当鼠标移动到一个元素A身上时,另外一个元素B显示. 实现原理: A元素与B元素有一个相同的父级. B元素默认隐藏,A元素默认显示. 当鼠标移动到A元素身上时,也可以看做是移动到了A元素的父级身上 ...

  3. 如何解决Your project contains C++ files but it is not using a supported native build system

    最近因为项目需要下载Android终端模拟器(Android-Terminal-Emulator)源码进行调试编译,编译过程中出现报错 Error:Execution failed for task ...

  4. Expo大作战(十八)--expo如何发布成独立应用程序,打包成apk或者ipa,发布到对应应用商店

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  5. Web Api通过文件流下载文件到本地实例

    最近项目里面需要和C++的客户端互动,其中一个接口就是需要提供文件下载的接口,保证C++项目调用这个接口的时候能够正常下载文件到本地.参考了一下网上的代码,其原理就是读取服务器上指定路径的文件流,并将 ...

  6. CSS未知宽高元素水平垂直居中

    方法一 :table.cell-table 思路:显示设置父元素为:table,子元素为:cell-table,这样就可以使用vertical-align: center,实现水平居中优点:父元素(p ...

  7. SELECT查询结果集INSERT到数据表

    简介 将查询语句查询的结果集作为数据插入到数据表中. 一.通过INSERT SELECT语句形式向表中添加数据 例如,创建一张新表AddressList来存储班级学生的通讯录信息,然后这些信息恰好存在 ...

  8. Eclipse 插件安装报错问题(已解决)

    错误信息提示: An error occurred while installing the items session context was:(profile=epp.package.jee, p ...

  9. 【Ansible 文档】【译文】入门教程

    http://docs.ansible.com/ansible/latest/intro_getting_started.html Foreword 前言 到这里,你应该已经安装了Ansible,是时 ...

  10. python爬虫(二)

    python爬虫之urllib 在python2和python3中的差异 在python2中,urllib和urllib2各有各个的功能,虽然urllib2是urllib的升级版,但是urllib2还 ...