如果您通过网页获取用户输入的数据并将其插入一个MySQL数据库,那么就有可能发生SQL注入安全的问题。
所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的,我们都需要对用户输入的数据进行过滤处理。
很多时候我们采用动态拼装sql,而这样的方式很容易通过拼接sql字符串进行注入。
**例如**
~~~
$sql = "select * from user where uid=$uid";
~~~
以上SQL如果有字符串处理,是根本不会这么写的,但有些时间没有字符串时你可能也习惯这么写,如果真这么写那么问题就来了
假如访问提交的是http://localhost/index.php?uid=1 or 1=1
SQL会变成:
~~~
select * from user where uid=1 or 1=1
~~~
通过上页我们知道,加引号是多么重要的事情,加上引号看看效果会有什 么变化,SQL变为如下形式
SQL会变成:
~~~
select * from user where uid='1 or 1=1'
~~~
但是如果你加了引号之后,如果用户再访问提交 http://localhost/index.php?uid=1' or 1=1%23
SQL会变成:
~~~
select * from user where uid='1' or 1=1#'
~~~
依然可以进行注入,在这种情况下,我们需要怎么做呢,我们尝试着把数据交给mysql_real_escape_string()或者addslashes()来转义特殊的输入字符。
SQL会变成:
~~~
select * from user where uid='1\' or 1=1#'
~~~
注入方式绝大多数依赖 <>'"& 这几个字符中的一个或几个对内容进行注入攻击。mysql_real_escape_string()并不能处理 <>,那这种情况下我们还应该怎么办,咱们可以通过htmlspecialchars函数将这些字符转换成无害的HTML 实体;目前TP的I方法就默认会对接收的数据通过这个函数进行过滤。
注入的场景有很多,在这里不一一列举,大家感兴趣,可以通过搜索引擎查找相关资料。
课外阅读:http://blog.sina.com.cn/s/blog_51af865b01009xsx.html
**安全注意事项**
1. 永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双"-"进行转换等。
2. 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
3. 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
4. 使用字符串查询条件,使用预处理机制。
5. 对数据类型为整形的,可以强制转换成整型。
6. 提高数据库表和字段的命名技巧,对一些重要的字段根据程序的特点命名,取不易被猜到的。
- 序言
- 第一章:准备工作
- 写在学习之前的话
- web应用开发结构
- 开发工具/环境
- 第二章:展现层面(HTML/CSS)
- HTML简介
- HTML基础
- HTML编码
- HTML链接
- HTML图像
- HTML列表
- HTML表单
- HTML表格(分水岭)
- HTML 实体
- HTML框架
- CSS层叠样式表
- CSS选择器
- CSS文本/字体
- CSS继承和叠加
- CSS框模型
- CSS浮动(分水岭)
- CSS定位
- CSS背景
- CSS图标字体
- CSS补充
- 开发技巧
- 第三章:展现层面(Javascript)
- JS简介
- JS实现
- JS输出交互
- JS变量
- JS数据类型
- JS运算符
- JS流程控制(分水岭)
- JS函数
- JS数组
- JS对象(分水岭)
- JS数组对象
- JS字符串对象
- JS数学对象
- JS日期对象
- JS BOM对象(分水岭)
- JS DOM对象
- JS事件对象
- JS元素对象
- JS DOM节点
- 第四章:展现层面(Jquery)
- JQ简介
- JQ使用
- JQ选择器
- JQ筛选
- JQ属性
- JQ-CSS
- JQ事件
- JQ文档处理
- JQ效果
- JQ-ajax
- 第五章:逻辑/业务层面(PHP)
- PHP简介
- PHP变量
- PHP数据类型
- PHP常量
- PHP运算符
- PHP流程控制
- PHP函数(分水岭)
- PHP日期
- PHP数学
- PHP数组
- PHP字符串
- PHP正则表达式(分水岭)
- PHP目录操作
- PHP文件
- PHP上传/下载
- PHP面向对象(分水岭)
- PHP图像处理
- PHP会话控制
- Ajax异步处理
- PHPMysql扩展
- PHPMysqli扩展
- PHPPdo扩展
- PHP接口
- PHP命名空间
- 第六章:逻辑/业务层面(框架设计)
- 第七章:存储层面(mysql)
- Mysql基础
- Mysql Sql简介
- Mysql数据库
- Mysql数据类型
- Mysql数据表
- Mysql操作记录
- Mysql查询
- Mysql修改表结构
- Mysql日期与时间
- Mysql分组统计
- Mysql多表查询
- Mysql安全
- Mysql存储引擎
- Mysql事务
- Mysql视图
- Mysql触发器
- Mysql存储过程
- Mysql存储函数
- Mysql优化
- 第八章:服务器(Linux)
- Linux介绍与安装
- Shell
- 目录与文件操作
- VIM编辑器使用
- 帐号管理
- SUDO
- 权限控制
- 压缩与打包
- 软件安装
- 计划任务
- 进程管理
- 宝塔Linux面板