php web开发安全之sql注入和防范:(一)简单的select语句注入和防范
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注入和防范:(一)简单的select语句注入和防范的更多相关文章
- WEB开发中一些常见的攻击方式及简单的防御方法
WEB开发中一些常见的攻击方式及简单的防御方法 转载:http://blog.csdn.net/seven__________7/article/details/70896913
- web开发中防止SQL注入
一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库. 二.SQL注入攻击的总体 ...
- 基于SQL和PYTHON的数据库数据查询select语句
#xiaodeng#python3#基于SQL和PYTHON的数据库数据查询语句import pymysql #1.基本用法cur.execute("select * from biao&q ...
- Web安全篇之SQL注入攻击
在网上找了一篇关于sql注入的解释文章,还有很多技术,走马观花吧 文章来源:http://www.2cto.com/article/201310/250877.html ps:直接copy,格式有点问 ...
- Java应用开发中的SQL注入攻击
1. 什么是SQL注入攻击? SQL注入攻击是黑客对数据库进行攻击的常用手段之一.随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员越来越多.但是由于程序员的水平及经验参差不齐,相当一部分 ...
- Web开发技术的演变
原文出处: WildFly 欢迎分享原创到伯乐头条 受到好文<Web开发的发展史>(英文)激发的灵感,写下我对web开发技术的认识. 1. 静态页面时代 大学时候,上机还得换卡穿拖鞋, ...
- Python做web开发,推荐几个能立马上手的小项目
Python这门优美的语言是非常适合web开发的,基于Python的Django框架简单便捷且很强大. 那么作为新手该如何上手这门语言?一切不敲代码的学编程手段都是扯淡,今天就推荐一些适合新手练手的P ...
- 转Web开发的发展史---Web开发技术的演变
转自:http://blog.csdn.net/zzzkk2009/article/details/9849431 在接下来的几个月时间里,我打算写一系列关于完整web开发的文章.这第一篇文章虽然有所 ...
- web开发中目录路径问题的解决
web开发当中,目录路径的书写是再常用不过了,一般情况下不会出什么问题,但是有些时候出现了问题却一直感到奇怪,所以这里记录一下,彻底解决web开发中路径的问题,开发分为前端和服务端,那么就从这两个方面 ...
随机推荐
- HTML:target=_blank、target=_top、target=_parent、target=_self 的区别
HTML:target=_blank.target=_top.target=_parent.target=_self 的区别 _blank 在新窗口中打开链接_parent 在父窗体中打开链接_sel ...
- 用eclipse 搭建struts2环境
一,下载struts2对应的jar包,(http://struts.apache.org/download.cgi#struts2514.1),我一般下载struts2.3版本的 二,打开eclips ...
- <Android开源库> PagerSlidingTabStrip从头到脚
简介 PagerSlidingTabStrip,是我个人经常使用到的一个和ViewPager配合的页面指示器,可以满足开发过程中常用的需求,如类似于今日头条的首页新闻内容导航栏等等,之前自己开发的Ju ...
- 活字格Web应用平台学习笔记4 - 添加记录
今天继续学习活字格基础教程,目标是创建一个页面,增加记录. 开始之前,系统会自动把上一次的工程文件加载进来. 这是做好后的样子. 我点添加员工的超链接: 先后加了2条员工的信息进来. 不错,设计界面是 ...
- Python+Selenium笔记(十四)鼠标与键盘事件
(一) 前言 Webdriver高级应用的API,允许我们模拟简单到复杂的键盘和鼠标事件,如拖拽操作.快捷键组合.长按以及鼠标右键操作,都是通过使用webdriver的Python API 中的Ac ...
- Google Play内购测试
Google Play内购测试 最近项目做海外版本,接入Google wallet支付后,测试验证比较繁琐,故记录一下. Google wallet支付方式接入完成后,需要按照如下步骤设置,才可以进行 ...
- 无线网卡加密方式wep wpa/wpa2 介绍
常见无线热点的配置选项:无线名称路由器的无线(Wi-Fi)名称.无线密码无线加密使用WPA2-PSK/WPA-PSK加密方式.AES加密算法,无线密码为8-63个字符,最好是数字.字母.符号的组合.信 ...
- html基础笔记-表单、链接
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <!-- 字符编码U ...
- supervisor 使用系列之一
supervisor 使用系列之一 前几年自己用PHP写过一个服务守护的脚本,初步实现了被守护脚本的状态监控.优雅杀死.以及自动重启的功能.面试的时候也有问到,为什么不使用supervisor这个工具 ...
- Go语言学习笔记(六)net & net/http
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 net import "net" net包提供了可移植的网络I/O接口,包括TCP/IP.UD ...