php 防止sql注入
Q:如果把用户输入的没有任何改动的放到SQL的查询语句中,很有可能会导致SQL注入,比如说下面的例子:
$unsafe_variable = $_POST['user_input']; 
mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
为什么会有注入漏洞呢?因为用户可以输入value'); DROP TABLE table;-- 然后查询语句就变成了这样
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
A:通过使用预编译语句(prepared statements)和参数化查询(parameterized queries)。
有两种方式去完成这个:
1. 使用PDO对象(对于任何数据库驱动都好用)
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute(array('name' => $name));
2. 使用MySqli
$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name);
$stmt->execute();
================
通常有一下几种方法:
(1)输入验证和过滤
(2)预处理Sql语句
(3)采用存储过程
(4)输入白名单
(5)一般的简单过滤,直接用php的addslashes函数即可。
全面防注入:
function inject_check($sql_str) {
 return eregi('select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile', $sql_str);  // 进行过滤
}
function verify_id($id=null) {
 if (!$id) { exit('没有提交参数!'); }  // 是否为空判断
 elseif (inject_check($id)) { exit('提交的参数非法!'); }  // 注射判断
 elseif (!is_numeric($id)) { exit('提交的参数非法!'); }  // 数字判断
 $id = intval($id);  // 整型化
 return $id;
}
function str_check( $str ) {
 if (!get_magic_quotes_gpc()) {  // 判断magic_quotes_gpc是否打开
  $str = addslashes($str);  // 进行过滤
 }
 $str = str_replace("_", "\_", $str);  // 把 '_'过滤掉
 $str = str_replace("%", "\%", $str);  // 把 '%'过滤掉
 return $str;
}
function post_check($post) {
 if (!get_magic_quotes_gpc()) {  // 判断magic_quotes_gpc是否为打开
  $post = addslashes($post);  // 进行magic_quotes_gpc没有打开的情况对提交数据的过滤
 }
 $post = str_replace("_", "\_", $post);  // 把 '_'过滤掉
 $post = str_replace("%", "\%", $post);  // 把 '%'过滤掉
 $post = nl2br($post);  // 回车转换
 $post = htmlspecialchars($post);  // html标记转换
 return $post;
}
/**
* 转义需要插入或者更新的字段值
*
* 在所有查询和更新的字段变量都需要调用此方法处理数据
*
* @param mixed $str 需要处理的变量
* @return mixed 返回转义后的结果
*/
public function escape($str) {
if (is_array($str)) {
foreach ($str as $key => $value) {
$str[$key] = $this->escape($value);
}
} else {
return addslashes($str);
}
return $str;
}
使用实例:
public function _saveWithWhere($tableName, $row, $where, $sync = false) {
        // 生成要插入/更新的字段的SQL字符串
        $values = '';
        foreach ($row as $searchKey => $val) {
            $values .= "`{$searchKey}` = '{escape($val)}',";
        }
        $values = trim($values, ",");
        // 有itemId的话就UPDATE没有的话就INSERT
        if (trim($where)) {
            $sql = "UPDATE {$tableName} SET {$values} WHERE {$where} ";
        }else {
            $sql = "INSERT INTO {$tableName} SET {$values}";
        }
          $this->saveLog($sql);
        // lib_DB->update 只返回  boolean 当 insert 的时候需要获取 last_id 就不行
        return $this->_update($sql, $sync);
    }
其他重要:
1. http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php
php 防止sql注入的更多相关文章
- 个人网站对xss跨站脚本攻击(重点是富文本编辑器情况)和sql注入攻击的防范
		
昨天本博客受到了xss跨站脚本注入攻击,3分钟攻陷--其实攻击者进攻的手法很简单,没啥技术含量.只能感叹自己之前竟然完全没防范. 这是数据库里留下的一些记录.最后那人弄了一个无限循环弹出框的脚本,估计 ...
 - Web安全相关(五):SQL注入(SQL Injection)
		
简介 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据 ...
 - 从c#角度看万能密码SQL注入漏洞
		
以前学习渗透时,虽然也玩过万能密码SQL注入漏洞登陆网站后台,但仅仅会用,并不理解其原理. 今天学习c#数据库这一块,正好学到了这方面的知识,才明白原来是怎么回事. 众所周知的万能密码SQL注入漏洞, ...
 - 浅谈SQL注入风险 - 一个Login拿下Server
		
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
 - 揭开SQL注入的神秘面纱PPT分享
		
SQL注入是一个老生常谈但又经常会出现的问题.该课程是我在公司内部培训的课程,现在分享出来,希望对大家有帮助. 点击这里下载.
 - 深入理解SQL注入绕过WAF和过滤机制
		
知己知彼,百战不殆 --孙子兵法 [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 ...
 - jdbc java数据库连接 8)防止sql注入
		
回顾下之前jdbc的开发步骤: 1:建项目,引入数据库驱动包 2:加载驱动 Class.forName(..); 3:获取连接对象 4:创建执行sql语句的stmt对象; 写sql 5:执行sql ...
 - Entity Framework关于SQL注入安全问题
		
1.EF生成的sql语句,用 parameter 进行传值,所以不会有sql注入问题 2.EF下有涉及外部输入参数传值的,禁止使用EF直接执行sql命令方式,使用实体 SQL 参考: https: ...
 - 关于SQL注入和如何防止
		
之前在笔试的时候没有很好的答出这个问题,因此我要总结一下问题,以免日后继续在这个地方跌倒,以下是自己的理解,如有错误请指出 一.什么是SQL注入 SQL注入就是服务器在根据业务去处理数据库的时候,客户 ...
 - Java防止SQL注入2(通过filter过滤器功能进行拦截)
		
首先说明一点,这个过滤器拦截其实是不靠谱的,比如说我的一篇文章是介绍sql注入的,或者评论的内容是有关sql的,那会过滤掉:且如果每个页面都经过这个过滤器,那么效率也是非常低的. 如果是要SQL注入拦 ...
 
随机推荐
- C#配置升级
			
void ConvertProject() { List<BaseProjectConverter> convertors = new List<BaseProjectConvert ...
 - SQL server 中的dbo、guest
			
dbo database owner 数据库的创建者,创建该对象的用户. guest 顾客 能够访问数据库中对象的数据, 要求dbo分配权限给guest, 一般给他查看的权限select 数据库所有者 ...
 - MySQL数据库update更新子查询
			
比如: ? 1 2 3 4 UPDATE test.tb_vobile a set a.name = '111 ' WHERE a.id = (select max(id) id from test. ...
 - eclipse开发Android程序sdk和avd的图标不见了
			
在eclipse中开发我们的Android程序时,安装sdk是必不可少的,有时候会出现sdk和avd的图标都不见了的情况,一般出现这种情况的原因是你从别处copy了一个sdk的包然后直接在引用造成的, ...
 - DW(一):大数据DW架构参考
			
DW一直以来是企业信息与决策支持系统的核心组件,随着各类日志.社交.传感等非结构化数据的加入,企业内部数据按指数级增长,传统DW已经达到一个关键临界点——需要大量的资源投入到硬件.优化.支持和维护中, ...
 - [oracle]  设置PL/SQL Developer 字符集
			
我安装的是PLSQL Developer(10)执行SQL发现弹出的错误提示对话框都是??表示,显示不出正确的提示信息.后来才明白是跟服务器的字符集不匹配的问题.方法如下:1.查询oracle ser ...
 - Panel扩展 圆角边框,弧形边框
			
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; u ...
 - SIM卡里的文件
			
SIM卡里的所有文件按树来组织:主文件MF(Master File)——每一块SIM卡只有一个唯一的主文件, 其他所有文件都是它的子孙, 主文件只有文件头,里面存放着整个SIM卡的控制和管理信息专用文 ...
 - Windows2008 Patching(打补丁)
			
我们都知道Windows的服务器都需要打补丁的,要不然漏洞那个叫多啊.Windows的系列服务器打补丁无非就是两种方法: 1. 通过Internet打补丁: Go to control Panel-& ...
 - Thinkpad X240修改bios引导方式
			
来源:http://blog.csdn.net/jsship/article/details/19121149 修改笔记本的BIOS设置!这是非常重要的步骤之一.否则,你的U盘不能引导手提电脑进入PE ...