首先来看下不做任何处理的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. Cesium 1.54评测 【转】

    重要功能评测 3dtiles数据上画线和贴纹理   3dtiles数据上画线和贴纹理 把线条贴到3dtiles上需要用到两个属性:clampToGround和classificationType. c ...

  2. 简述 IntentFilter(意图过滤器)

    1.什么是IntentFilter ? IntentFilter翻译成中文就是“意图过滤器”,主要用来过滤隐式意图.当用户进行一项操作的时候,Android系统会根据配置的 “意图过滤器” 来寻找可以 ...

  3. yum提示problem making ssl connection的解决办法

    yum缓存提示problem making ssl connection的解决办法 缺少ssl证书认证本地获取的问题导致,解决办法如下: 执行命令:yum install -y ca-certific ...

  4. ocketMQ概念模型

    ocketMQ概念模型 https://blog.csdn.net/binzhaomobile/article/details/73332463 HTTPS://blog.CSDN.net/bin找M ...

  5. odoo开发笔记 -- 还原数据库后,异常:ir_attachment: IOError: [Errno 2] No such file or directory: u'/var/...'

    场景描述: 恢复Odoo数据后,抛出错误导致无法进入页面 -- ::, INFO aeo odoo.addons.base.ir.ir_attachment: _read_file reading / ...

  6. HTML+CSS编写五环居中案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. docker使用redis.conf配置文件方式启动redis无反应无日志

    如题,场景重现:因为配置多了,不想通过参数来启动docker容器中的redis,特意上github找了对应版本的redis.conf,修改了相关配置,只让本机使用: 上传到/mydata/redis/ ...

  8. redis支持远程接入的安全防护问题

    如果我们没有启用保护模式,支持远程接入,启用默认端口6379,而且是用root用户启动的,那么基本上redis就是在裸奔了,人家分分钟搞你没商量. 我们模拟一下,现在机器A(ip假设为10.100.1 ...

  9. wms证书配置操作

      1. 在应用的/home下 把证书cp到/usr/local/apache2/conf 2. 打开文件/usr/local/apache2/conf/extra/httpd-ssl.conf,找到 ...

  10. k8s记录-国内下载k8s组件镜像

    #!/bin/sh ### 版本信息 K8S_VERSION=v1.13.2 ETCD_VERSION=3.2.24 DASHBOARD_VERSION=v1.8.3 FLANNEL_VERSION= ...