首先来看下不做任何处理的php登录,首先是HTML页面代码

<html>
<head><title>用户登录</title></head>
<body>
<fieldset>
<legend><h3>用户登录</h3></legend>
<form action="user_login_pro.php" method="post">
用户账号:<input type="text" name="name"><br><br>
用户密码:<input type="password" name="password"><br><br>
<input type="submit" value="登录">
</form>
</fieldset>
</body>
</html>

其次是php处理代码:

//引入PDO连库文件
require './database/db.php'; $name = $_POST['name'];
$password = $_POST['password'];
$sql = "select * from user where name ='{$name}' and password ='{$password}'";
$res = $pdo->query($sql);
$row = $res->fetch(PDO::FETCH_ASSOC); if($row){ echo "login success";
}else{
echo "login error";
}

页面效果:

从上面的代码可见,我们输入账户名密码后,进入处理页面,与数据库作对比,如果账号密码都正确的情况之下,输出login success ,错误则输出login error。运行效果也正常,但如果我们在账户名处输入如下代码【' or 1=1 #】也会输出login success。这就是sql注入,通过一些代码改变了我们的sql语句,我们输出一次sql语句是什么样子的呢?select * from user where name ='' or 1=1 #' and password ='';可以发现这条sql语句变成了恒成立的语句,诸如此类的方式其实有很多,那么我们怎么防止sql注入呢?

1.使用pdo预处理

//1.准备预处理语句
$sql = "select * from user where name =? and password =?";
$res = $pdo->prepare($sql); //2.绑定参数
$name = $_POST['name'];
$password = $_POST['password']; $res->bindParam(1,$name);
$res->bindparam(2,$password); //3.执行预处理语句
$res->execute(); //4.转成一条结果
$row = $res->fetch(PDO::FETCH_ASSOC); //5.判断
if($row){
echo "login success";
}else{
echo "login error";
}

我们用?占位符把公共的操作部分 与 可变的数据部分相分离。根据上面的步骤执行一遍,再用 【' or 1=1 #】去测试,输出login error。成功防止。

2.addslashes()函数转义

$name = addslashes($_POST['name']);
$password = $_POST['password'];
$sql = "select * from user where name ='{$name}' and password ='{$password}'";
//print_r($sql);die();
$res = $pdo->query($sql);
$row = $res->fetch(PDO::FETCH_ASSOC); if($row){ echo "login success";
}else{
echo "login error";
}

还用上面的sql注入,结果也是失败的。证明防止成功。addslashes() 函数在指定的预定义字符前添加反斜杠。这些字符是单引号(')、双引号(")、反斜线(\)与NUL(NULL字符)。在使用这种方式后,sql语句就变为了:select * from user where name ='\' or 1=1 #' and password ='1234567';

3.intval()

在很多时候我们要用到类似xxx.php?id=xxx这样的URL,一般来说$id都是整型变量,为了防范攻击者把$id篡改成攻击语句,我们要尽量强制变量,PHP防范SQL注入的代码$id=intval($_GET['id']);

//intval() 防止整数类型被改变
$id="abc123";
echo intval($id);

输出结果为0;可以知道intval()可以将字符串转成整数,故而可以防止整数类型被改变。

2017-07-25 PDO预处理以及防止sql注入的更多相关文章

  1. MySQL pdo预处理能防止sql注入的原因

    MySQL pdo预处理能防止sql注入的原因: 1.先看预处理的语法 $pdo->prepare('select * from biao1 where id=:id'); $pdo->e ...

  2. PDO预处理语句规避SQL注入攻击

    所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存 ...

  3. PHP中使用PDO的预处理功能避免SQL注入

    不使用预处理功能 <?php $id = $_GET['id']; $dsn = 'mysql:host=localhost;port=3306;dbname=database'; try { ...

  4. 预处理(防止sql注入的一种方式)

    <!--- 预处理(预编译) ---><?php/* 防止 sql 注入的两种方式: 1. 人为提高代码的逻辑性,使其变得更严谨,滴水不漏. 比如说 增加判断条件,增加输入过滤等,但 ...

  5. 为什么说Mysql预处理可以防止SQL注入

    简单点理解:prepareStatement会形成参数化的查询,例如:1select * from A where tablename.id = ?传入参数'1;select * from B'如果不 ...

  6. SQL注入汇总(手注,盲注,报错注入,宽字节,二次编码,http头部){10.22、23 第二十四 二十五天}

    首先什么是SQL注入: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. SQL注入有什么危害? 危害:数据泄露.脱库 ...

  7. 【DVWA】【SQL Injection】SQL注入 Low Medium High Impossible

    1.初级篇 low.php 先看源码,取得的参数直接放到sql语句中执行 if( isset( $_REQUEST[ 'Submit' ] ) ) { // Get input $id = $_REQ ...

  8. CTF SQL注入

    目录 一.宽字节注入 二.基于约束的注入 三.报错注入 四.时间盲注 五.bool盲注 六.order by的注入 六.INSERT.UPDATE.DELETE相关的注入 七.堆叠注入 八.常用绕过 ...

  9. php+mysql如何防止sql注入

    方法: 1.预处理.(预处理语句针对SQL注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性.) 2.mysql_real_escape_string -- 转义 SQL 语句中使用 ...

随机推荐

  1. EAccessViolation

    Access Violation(非法访问),General Protection Fault(一般保护性错误)或者Invalid Page Fault(无效页面错误),虽然说法不一样,但本质上总是由 ...

  2. SpringBoot(十八):SpringBoot2.1.1引入SwaggerUI工具

    Swagger是一个有用web界面的提供实体模型结构展示,接口展示,调测等的一个工具,使用它可以提高开发者开发效率,特别是前后端配合开发时,大大省去了沟通接口耗费的时间:服务端开发完接口发布后,UI端 ...

  3. 【C++】C++中的容器解析

    目录结构: contents structure [-] 顺序容器 顺序容器的种类 顺序容器的操作 容器操作可能使迭代器失效 Vector容器的增长机制 容器适配器 关联容器 关联容器的分类 关联容器 ...

  4. IIS服务器怎么查看网站日志

    在做网站的优化以及网站安全的时候,分析网站的日志是非常重要的,但是公司的服务器是IIS的,以前弄的是linux的服务器,不知道该怎么弄,最终找到了解决办法. 1.iis默认是有日志的,在iislog下 ...

  5. PL/SQL【32位】连接Oracle 11g【64位】

    下载64位Oracle安装: 下载PL/SQL安装:下载instantclient-basic-win32-12.1.0.1.0.zip,解压后剪切instantclient_12_1文件夹,粘贴到O ...

  6. mac软件安装 for Mac

    Office 2019 for Mac 16.31(191110)官方原版安装包&激活 赠送Office 2016 16.16.16(191111) --------- https://www ...

  7. PHP 动态输出 svgz 格式图片

    使用PHP动态生成SVGZ图片(gzip压缩的SVG) 经测试SVG的动画性能很差,简单的动画CPU都能占到 30%左右. 可能的用途: 动态天气图片 访问统计计数图片 文字验证生成 动态头像 静态外 ...

  8. C++ Set运用实例

    C++ Set运用实例 #include <iostream> #include <set> #include <algorithm> #include <i ...

  9. Hadoop学习笔记——HDFS

    1.查看hdfs文件的block信息 不正常的文件 hdfs fsck /logs/xxx/xxxx.gz.gz -files -blocks -locations Connecting to nam ...

  10. springboot docker 部署

    1.新建一个最简单的springboot项目 https://code.aliyun.com/859143303/hello-world.git 2.src/main/docker下新建Dockerf ...