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. 数据表自增Id获取时IDENTITY的正确使用方式

    在SQLServer中很多表主键会设置为自增列,有的业务需求需要知道新插入的自增Id是多少,一般我们会用SELECT @@IDENTITY来获取,可由于@@IDENTITY是个全局变量作用据较大,所以 ...

  2. Memcached+WebApi记录

    一.安装Memcached Memcached1.2.6 http://files.cnblogs.com/files/jasonduan/11465401756756.zip Memcached.C ...

  3. Android开发工具Android Studio、Android SDK和Genymotion完全配置

    所谓“工欲善其事,必先利其器”.Android Studio 是谷歌推出一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提 ...

  4. Python网络爬虫笔记(一):网页抓取方式和LXML示例

    (一)   三种网页抓取方法 1.    正则表达式: 模块使用C语言编写,速度快,但是很脆弱,可能网页更新后就不能用了. 2.    Beautiful Soup 模块使用Python编写,速度慢. ...

  5. 基于MSMQ绑定的WCF服务实现总结

    一. 创建消息队列    1 1) 创建一个非事物性的私有队列    1 2)设置消息队列访问权限    2 二.创建WCF服务并绑定消息队列    4 1)创建HelloService服务    4 ...

  6. 使用 Azure Active Directory 管理 Azure 中的 HPC Pack 群集

    Microsoft HPC Pack 2016 支持在 Azure 中部署 HPC Pack 群集的管理员将其与 Azure Active Directory (Azure AD) 集成. 请按照本文 ...

  7. c#中的数据类型简介(委托)

    什么是委托? 委托是一种类型,它封装了一类方法,这些方法具有相同的方法签名(signature)和返回类型.定义听起来有点拗口,首先可以确定委托是一种数据类型,那么什么是方法签名,其实就是指方法的输入 ...

  8. scp机器间远程拷贝

    scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令.linux的scp命令可以在linux服务器之间复制文件和目录. 使用语法:scp  [参数 ...

  9. October 21st 2017 Week 42nd Saturday

    Only I can change my life. No one can do it for me. 只有我可以改变我的命运,没有人可以帮我做. Stop complaining about the ...

  10. LINE学习

    LINE Abstract LINE 是一种将大规模网络结点表征成低维向量的算法,可很方便用于网络可视化,结点分类,链路预测,推荐. source code Advantage LINE相比于其他算法 ...