一、php 的 sql 注入攻击

1.1、什么是 sql 注入攻击

用户提交一段数据库查询代码,根据返回的结果,获得某些他想得到的数据。

比如 :查询某个管理员是否存在,一般程序员会这么写$sql = "select * from user where name='luluyii' and password='****'";

if (查询到) {

header("admin.php");

}else {

header("login.php");

}

这样写,容易被人通过 sql 注入攻击进入你的 admin.php 页面。

1.2、万能密码和万能用户名

(1)方式一

① 万能密码$sql = "select * from user where name='**' and password='***' or 1='1'";

即万能密码是:**' or 1='1

② 万能用户名$sql = "select * from user where name='**' union select * form user/* and password='***';

/*表示不执行后面的语句,即万能用户名是:**' union select * from user/*

(二)方式二$sql = 去掉 '$name' 和 '$password'的单引号;

这种写法,没有' ',mysql数据库会把你的输入当数字对待

① 使用万能密码:数字 union select * form user

② 使用万能用户名:数字 union select * form user/*

1.3、防止用户登录注入

(1)在php.ini 中开启 magic_quotes_gpc = On,但是这个特性在 php 5.3.0 中已经废弃,并且在 php 5.4.0 中已经移除。

若配置了,方式一中的万能用户名和万能密码将失效,但是方式二仍然有效。

原因是:当改为 on 之后,Apache 服务器会对 ' 加入 \ 转义,如name = 'luluyii',当数据库执行时,变成 name = \'luluyii\'

(2)密码对比法

① 基本思想:改变验证数据库用户逻辑。

首先通过用户输入的用户名去查询数据库,如果查询到这个用户对应的密码,和用户提交的密码对比,相同则说明该用户合法,否则不合法。$sql = "select password form user where name='luluyii'";

if(从数据库查询到的密码 == 用户输入的密码){

header("admin.php");

}else{

header("login.php");

}

分析:这样写,用户无法通过 password = 注入攻击,因为 if( == ) 是在php中验证的。

② 使用 pdo 的预编译来解决 sql 注入

首先在 php,ini 中启用 pdo:extension = php_pdo_mysql.dll$mypdo = new PDO("mysql:localhost;port=3306;dbname=luluyii","root","root");

$pdoStatment = $mypdo->prepare($sql); //预编译

$pdoStatment->execute(array($name,$password)); //接收

$pdoStatment->fetch(); //取出结果

1.4、php 搜索引擎中 sql 注入问题

(1)一般使用 _ _ 和 % 攻击,获取所有数据

(2)防止查询 sql 攻击$keyWord = addslashes($keyWord); //使用反斜杠引用字符串

$keyWord = str_replace("%","\%",$keyWord); //将 % 替换为 \%

$keyWord = str_replace("_","\_",$keyWord); //将 _ 替换为 \_

1.5、总结

防止 SQL 注射漏洞一般用什么函数?addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。

$str = addslashes('Shanghai is the "biggest" city in China.');

echo($str);

//输出 Shanghai is the \"biggest\" city in China.

sql 注入的方式还有其它很多形式,我们要写出健壮安全的代码,就要不断提高编写安全代码的意识,让我们的代码更符合

商业要求。

二、php 数据库编程 mysqli、pdo

2.1、mysqli

2.1.1、mysql 和 mysqli 说明

(1)msyqli 是 mysql 扩展库的增强版

(2)mysql 和 mysqli的比较

① mysqli 的稳定性、安全性、效率都有所提升

② mysqli 支持面向对象编程,同时考虑到 php 老程序员,提供面向过程的编程风格

2.1.2、案例$conn = mysqli_connect("localhost",'root','root');

if (!$conn){

die("数据库连接失败".mysqli_error());

}

mysqli_select_db($conn,"luluyii");

mysqli_query($conn,"set names utf8");

$sql = "select * from lulu_user";

$res = mysqli_query($conn,$sql);

while($row = mysqli_fetch_row($res)){

foreach ($row as $key=>$val){

echo "$val--";

}

echo "
";

}

mysqli_free_result($res);

mysqli_close($conn);

2.1.3、细节说明

(1)关闭连接和释放资源

mysqli_close($conn); //关闭连接,是把 ① 断开;

mysqli_free_result($res); //释放资源,是把 ② 断开。

(2)从 $res 获取行数据的四个方法① mysqli_fetch_row 返回一个索引数组

② mysqli_fetch_assoc 返回一个关联数组

③ mysqli_fetch_array 返回索引和关联数组

④ mysqli_fetch_object 把一行数据当做对象返回

(3)函数mysqli_insert_id($conn)  取得上一步 Insert 操纵产生的 ID

$field_info = mysqli_fetch_field($res) 返回包含字段信息的对象,如$field_info->name

mysqli_affected_rows($conn) 取得前一次mysql操作所影响的记录行数

(4)三种释放 $res 结果集的方法

① $res->free(); ② $res->close(); ③ $res->free_result();

2.1.4、批量执行sql 语句

ddl 数据定义语句:CREATE TABLE

dml 数据操作语句:update、insert、delete

dql 数据查询语句:select

dcl 数据事务语句:rollback、commit

(1)批量执行 dml 语句$sqls = "sql1;sql2;...";

$mysqli->multi_query($sqls);

(2)批量执行 dql 语句$mysqli->store_result(); //从 mysqli 连接取出一个结果集

$mysqli->fetch_row();

$mysqli->more_results(); //用于判断是否有新的结果集

$mysqli->next_result(); //用于指向下一个结果集,但它不会判断下一个结果集是否存在,故需使用 $mysqli->more_results()

2.2、事务控制

2.2.1、概念

事务用于保证数据的一致性,它由一组相关的 dml 语句组成,该组的 dml 语句要么全部成功,要么全部失败。

如:网上转账就是典型的要用事务来处理,用以保证数据的一致性。

2.2.2、事务的 ACID 性质

① Atomicity 原子性:操作不可分割,要么都发生,要么都不发生

② Consistency 一致性:是一个数据库从一个一致性状态到另一个一致性状态

③ Isolation 隔离性:一旦开始事务,别的操作无法使用你正在使用的数据库

④ Durability 持久性:一旦提交,数据库的状态不再发生变化

2.2.3、在 mysqli 控制台可以使用事务来操作

① start transaction 开启一个事务

② savepoint a 保存点

③ 操作

④ 可回滚,可提交:若无问题 —— commit 提交,若有问题 —— rollback to a 回滚到 a

2.3、mysqli 扩展库的预编译处理技术

$sql = "insert into user (name,password,email,age) values(?,?,?,?)";

这里的 ? 是个占位符,告诉数据库无需编译,只是数据的变化。

优点:效率高,执行速度快;安全性高,防止 sql 注入。

2.4、PDO —— PHP Data Object

2.4.1、基本介绍

① 该扩展在 PHP 5 中加入

② PHP 6 中默认使用 PDO 连接数据库

2.4.2、什么是 PDO

PDO 相当于是一个数据库抽象层,不同数据库使用相同的方法名,解决数据库连接不统一的问题。

php万能查询用预,PHP 与 mysql相关推荐

  1. 使用ActiveX实现的Web自定义查询-万能查询

    -----前言------     从事C/S.WEB开发已有多年,一直比较关注"自定义查询"."万能查询"这些概念.在项目开发中,用户会经常要求对查询统计报表 ...

  2. php mysql 字段不为空_Thinkphp中查询复杂sql查询表达式,如何表达MYSQL中的某字段不为空is not null?...

    Thinkphp中查询复杂sql查询表达式,如何表达MYSQL中的某字段不为空is not null? 先上两种实现方式的实例: $querys["house_type_image" ...

  3. MYSQL避免全表扫描__如何查看sql查询是否用到索引(mysql)

    MYSQL避免全表扫描 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引 2.应尽量避免在 where 子句中对字段进行 null 值判断,否 ...

  4. mysql两个查询结果差集_【Mysql】求两个表(查询结果)的差集

    求两个查询结果的差集,Mysql直接提供了关键字not in,但是not in的效率极其低下,出现例如求一个上千查询结果在上万查询结果的差集,那么使用not in来查询的查询速度极其缓慢,这是必须使用 ...

  5. 结构化查询语句简称mysql_整理MySql常用查询语句

    MySql的性能优化 性能优化是通过某些有效的方法提高MySQL数据库的性能.性能优化的目的是为了是MySQL数据运行速度更快.占用的磁盘空间更小.性能优化包括很多方面,例如优化查询速度.优化更新速度 ...

  6. PHP 万能查询代码

    小项目中存在很多省市区加模糊查询: 以下THINKPHP + JS 构成万能查询代码:方便快捷. 前端: <select id="s_province" name=" ...

  7. DataQL之语法-万能查询执行步骤

    万能查询执行步骤 引用包 <dependency><groupId>net.hasor</groupId><artifactId>hasor-dataq ...

  8. (16)万能查询还是万恶查询?

    在项目中,开发为了方便用户(也为了方便自己),很多都会在前端基类弄个万能查询的模块,在做介面时调一下就能使用了,它能列出很多的字段,让用户自己选择字段及表达式,条件与条件组合,可以几乎无限的加条件上去 ...

  9. Alexa 排名万能查询系统

    Alexa 排名万能查询系统 上届奥运会百米金牌得主是谁? 刘翔贝, 那第二呢? 这个..........还真不知道 题记 Alexa 排名万能查询系统 是基于关键字的网站域名相关性研究项目简介 的一 ...

最新文章

  1. 转载-SQL Server各种导入导出数据方式的比较
  2. Java并发专题 带返回结果的批量任务执行 CompletionService ExecutorService.invokeAll
  3. tcp socket 异常关闭总结
  4. Vue单文件组件与vue-loader
  5. windows平台桌面开发技术
  6. 面试题(一)—Java基础(上)
  7. php ajax练习
  8. 2019年阿里最新java编程规范-在线版
  9. linux mailx 发送多个附件,CentOS安装mailx用命令以SMTP方式发送带附件邮件可用SSL
  10. MyEclipse2018安装破解教程
  11. rtthread学习之(2)——STM32 系列外设驱动添加指南
  12. windows7 使用激活工具激活系统出现的问题汇总
  13. mysql binlog 查看pos点_查看MySQL日志数据binlog文件
  14. 如何快速看懂英文论文?
  15. numpy的squeeze函数和expand_dims函数
  16. ettercap dns投毒
  17. 智能汽车操作系统行业研究及十四五规划分析报告
  18. git clone出现 fatal: unable to access ‘https://github.com/...‘resolve host: ds-git.gree.com的解决办法
  19. 计算机游戏快速退出的快捷键,电脑玩游戏怎么快速切回桌面
  20. 人工智能的核心技术是什么?

热门文章

  1. 猎豹网matlab视频百度云,猎豹网校C++ Primer初级全套视频教程
  2. npu算力如何计算_CPU、GPU、NPU、FPGA等芯片架构特点分析
  3. centos安装无线网卡驱动_CentOS下显卡驱动安装的相关思考
  4. linux awr 日志,Linux平台生成awr报告
  5. html怎么在字体中加波浪线,CSS3实现文字波浪线效果
  6. redmine两个mysql_Redmine3.4.2安装记(Win10+MySql)
  7. ABS_MT_TOUCH_MAJOR和ABS_MT_WIDTH_MAJOR
  8. VxWorks基本OS介绍
  9. Linux重启网卡的方法
  10. rnn神经网络模型_一文读懂序列建模(deeplearning.ai)之循环神经网络(RNNs)