PHP防SQL注入攻击

2 篇文章 0 订阅

以下摘自百度知道

  1. 过滤一些常见的数据库操作关键字, select , insert , update , delete , and , * 等或通过系统函数addslashes()对内容进行过滤,addslashes()函数返回在预定义字符之前添加反斜杠的字符串。预定义字符是:单引号(’),双引号(”),反斜杠(\),NULL
  2. php配置文件中register_globals=off;设置为关闭状态.(register_globals的意思就是注册为全局变量,所以当On的时候,传递过来的值会被直接的注册为全局变量直接使用,而Off的时候,我们需要到特定的数组里去得到它。PHP 4.2.0 版开始,配置文件中 register_globals 的默认值从 on 改为 off 了)
  3. sql语句书写的时候尽量不要省略小引号(tab上面那个)和单引号
  4. 提高数据库命名技巧,对于一些重要的字段根据程序的特点命名,使之不易被猜中
  5. 对于常的方法加以封装,避免直接暴漏SQL语句
  6. 开启PHP安全模式safe_mode=on
  7. 打开magic_quotes_gpc来防止SQL注入,默认为关闭,开启后自动把用户提交sql查询语句进行转换把”’”转换成”\’”
  8. 控制错误信息输出,关闭错误信息提示,将错误信息写到系统日志
  9. 使用MYSQLI 或PDO预处理

下面详细说明下PDO
MySQL 是 PHP 操作 MySQL 数据库最原始的 Extension。MySQLi 的 i 代表 Improvement ,提供了相对进阶的功能,就 Extension 而言,本身也增加了安全性。而 PDO(PHP Data Object)则是提供了一个 Abstraction Layer 来操作数据库。PDO是一个mysql官方封装的,基于面向对象编程思想的,使用c语言开发的数据库抽象层。

1、PDO 连接数据库时通过 Connection String 来决定连接何种数据库。
2、PDO 可以通过 PDO::setAttribute 来决定连接时的设定,比如 Persistent Connection,回传错误的方式(Exception,E_WARNING,NULL)。甚至是回传参数名称的大小写等等。
3、PDO 支持 Bind Column 的功能,除了基本的 Prepare,Execute 以外,也可以 Bind 单一参数,并且指定参数类型。
4.、PDO 是 Abstraction Layer,所以就算更换储存媒介,需要花的功夫比起来是最少的。

基本查询

查询操作主要是PDO::query()、PDO::exec()、PDO::prepare()。
PDO::query()主要是用于有记录结果返回的操作,特别是SELECT操作,
PDO::exec()主要是针对没有结果集合返回的操作,比如INSERT、UPDATE、DELETE等操作,它返回的结果是当前操作影响的列数。
PDO::prepare()主要是预处理操作,需要通过$rs->execute()来执行预处理里面的SQL语句,这个方法可以绑定参数,功能比较强大,不是本文能够简单说明白的,大家可以参考手册和其他文档。
获取结果集操作主要是:PDOStatement::fetchColumn()、PDOStatement::fetch()、PDOStatement::fetchALL()。
PDOStatement::fetchColumn()是获取结果指定第一条记录的某个字段,缺省是第一个字段。
PDOStatement::fetch()是用来获取一条记录,
PDOStatement::fetchAll()是获取所有记录集到一个中,获取结果可以通过PDOStatement::setFetchMode来设置需要结果集合的类型。
另外有两个周边的操作,一个是PDO::lastInsertId()和PDOStatement::rowCount()。PDO::lastInsertId()是返回上次插入操作,主键列类型是自增的最后的自增ID。
PDOStatement::rowCount()主要是用于PDO::query()和PDO::prepare()进行DELETE、INSERT、UPDATE操作影响的结果集,对PDO::exec()方法和SELECT操作无效。

连接查询实例
<?php
$dsn = "mysql:host=$db_host;dbname=$db_name";
$dbh = new PDO($dsn, $db_user, $db_password);
$sql = "SELECT `id`, `name` FROM `users` WHERE `id` = ? , `name` = ?";
$sth = $dbh->prepare($sql);
$sth->execute(array($location, $name));
$result = $sth->fetch(PDO::FETCH_OBJ);
echo $result->id . $result->name;
$dbh = NULL; 
?>
事务
<?php
try {
  $dbh = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2', 
      array(PDO::ATTR_PERSISTENT => true));
  echo "Connected\n";
} catch (Exception $e) {
  die("Unable to connect: " . $e->getMessage());
}

try {  
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//产生致命错误,PDOException
  $dbh->beginTransaction();
  purchase($id,$fundcode);
  $dbh->exec("insert into purchase (id, card, fundcode) values (1, '6221501000001234567', '000706')");
  $dbh->commit();

} catch (Exception $e) {
  $dbh->rollBack();
  echo "Failed: " . $e->getMessage();
}
?>

以下摘自http://zhangxugg-163-com.iteye.com/blog/1835721
关于禁止PHP本地转义而交由MySQL Server转义
PDO有一项参数,名为PDO::ATTR_EMULATE_PREPARES ,表示是否使用PHP本地模拟prepare,此项参数默认值为true。不能完全防止sql注入攻击。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值