参考资料:

PHP中防止SQL注入的方法
php操作mysql防止sql注入(合集)
PDO防注入原理分析以及使用PDO的注意事项
php SQL 防注入的一些经验
如何在PHP中防止SQL注入?
PHP安全编程:防止SQL注入
addslashes与mysql_real_escape_string的区别
How can I prevent SQL injection in PHP?

什么是SQL注入?

Sql注入,是通过程序员编程时的疏忽,经过查找sql注入的位置、判断服务器类型和后台数据类型、针对不同类型的服务器以及数据库进行攻击,实现无账号登录,甚至篡改数据库。

解决方法

1.魔术函数 addslashes

Addslashes()是与stripslashes()是功能相反的函数。
Addslashes()用于给变量中的’ ” 与null添加反斜杠\,用于避免传入sql语句的参数格式错误,同时如果有人注入子查询,通过加可以将参数解释为内容,而非执行语句,避免被mysql执行。
Addslashes()只在PHP中执行,\是不会写入mysql中的。
当 PHP 指令 magic_quotes_sybase 被设置成 on 时,意味着开启addslashes()。
在PHP5.4.0版本之前,magic_quotes_sybase 默认开启。
可以通过函数get_magic_quotes_gpc()判断magic_quotes_gpc是否开启。

if (!get_magic_quotes_gpc()) {$lastname = addslashes($_POST[‘lastname’]);} else {$lastname = $_POST[‘lastname’];}

但是addslashes()并不会检测字符集,比如如果是gbk编码,可能会将某些字符解释成两个ASCII字节,造成新的注入风险。Utf没有这个问题。

2.mysql_real_escape_string

mysql_real_escape_string()与addslashes()相比,不仅会将’ " NOL(ascii的0)转义,还会把r n进行转义。同时会检测数据编码。
mysql_real_escape_string()使用时需要进行数据库的连接,因为要获取数据库的字符集,如果当前不存在连接,会使用上一次连接。
这个函数在PHP5.5.0不被推荐使用,PHP7.0被废弃

3.预处理 (Prepared Statements) ---- mysqli:prepare()

Mysqli的参数化绑定

$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'world');
$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;
$stmt->bind_param('sssd', $code, $language, $official, $percent);

mysqli=newmysqli("example.com","user","password","database");
stmt = mysqli−>prepare("SELECT id,label FROM test WHERE id=?");
stmt->bind_param(1, city);stmt->execute();
res=stmt->get_result();
row=res->fetch_assoc();

Mysqli预处理查询是将一步查询分作两步操作
A 写sql语句,用?占位,替代sql中的变量
B 替换变量
C 执行SQL语句
D 得到一个二进制结果集,从二进制结果中取出php结果集
E 遍历结果集

4.预处理 (Prepared Statements) ---- PDO

使用PDO参数化绑定
类似于mysqli也是分两步预处理

$pdo = new PDO("mysql:host=192.168.0.1;dbname=test;charset=utf8","root");
$st = $pdo->prepare("select * from info where id =? and name = ?");$id = 21;
$name = 'zhangsan';
$st->bindParam(1,$id);
$st->bindParam(2,$name);$st->execute();
$st->fetchAll();

PHP将sql模板和变量两次发送给mysql,由mysql进行变量的转义处理。
PHP版本不同,有不同的处理方式。
PHP版本小于5.3.6,需要关闭PHP使用本地模拟prepare
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
PHP版本为5.3.6+的,请在在PDO的DSN中指定charset属性
因为PHP5.3.6版本之前,并不支持PDO的DSN charset设定

总结

控制注入主要分三个方面:
1.做参数合法性,特殊字符,长度校验
2.数据库中严格设定参数类型,没必要用字符串类型的,就少用,不得已使用可以控制字符长度;能用int,bool之类的就用此种类型
3.操作SQL采用参数化(parameter)

PHP SQL防注入相关推荐

  1. SQL防注入程序 v1.0

    /// ***************C#版SQL防注入程序 v1.0************ /// *使用方法: /// 一.整站防注入(推荐) /// 在Global.asax.cs中查找App ...

  2. 方立勋_30天掌握JavaWeb_JDBC、SQL防注入(一)

    JDBC简介 数据库驱动 SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC. JDBC全称为:Java Data Base Connectivity(java ...

  3. PHP之SQL防注入代码,PHP防XSS 防SQL注入的代码

    360提示XSS漏洞?这个XSS漏洞很不好修复.....如果是PHP程序的话,可以用下面的代码来过滤... PHP防XSS 防SQL注入的代码 class protection{public stat ...

  4. sql防注入解决办法

    sql防注入步骤: 1. 什么是SQL注入?我理解的sql注入就是一些人可以通过恶意的参数输入,让后台执行这段SQL,然后达到获取数据或者破坏数据库的目的!举个简单的查询例子,后台sql是拼接的:se ...

  5. Python之SQL 防注入问题,绕过登录验证进入数据库,可能会导致大问题。

    SQL 防注入问题 所谓SQL注入,就是通过把SQL命令插入到Web表单提 交或输入域名或页面请求的查询字符串,最终达到欺骗 服务器执行恶意的SQL命令. 例子 user="root&quo ...

  6. 若依框架(SpringBoot)增加SQL防注入处理,SpringBoot增加SQL防注入

    文章目录 若依框架增加SQL防注入处理,SpringBoot项目可用 增加Filter 若依框架增加SQL防注入处理,SpringBoot项目可用 思路:增加Filter对请求中的请求参数进行过滤进行 ...

  7. 屏蔽php显示错误信息+sql防注入常用函数

    屏蔽php显示错误信息 那是因为php.ini中关闭了错误显示,将错误写成了文件,这是人为设置的结果 display_errors =on就好了. 当PHP启动的时候,它将在Web服务器标准头信息中添 ...

  8. ASP。NET 中SQL防注入攻击

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

  9. php 自带sql防注入函数,php 防Sql注入函数的简单示例

    这篇文章主要为大家详细介绍了php 防Sql注入函数的简单示例,具有一定的参考价值,可以用来参考一下. 传入用户提交的参数时使用这段代码提供的函数先对参数进行处理,然后传入sql语句, 用: mysq ...

最新文章

  1. 快速失败Vs安全失败(Java迭代器附示例)
  2. 打印Show Attend and Tell的损失函数
  3. 点云处理软件Pointscene
  4. .NET Core 反射获取所有控制器及方法上特定标签
  5. 这些常见的分布式存储系统,你是否都了解?
  6. android在java下建立模块,Android Studio:如何在Android模块中包含Java模块?
  7. React常用的命令解析
  8. python+selenium+geckodriver,自动化脚本
  9. centos7刷新dns
  10. 文电通PDF编辑转换器[DocuCom PDF Gold] 8.0
  11. 微信小程序请求php文件报错,微信小程序wx.request请求数据报错
  12. 关于Ransomware备份 哪些是该做和不该做的?
  13. 180701 icon文件查找与转换网站
  14. vim 删除文件单行或多行内容
  15. 【问题】vcenter7升级遇到“Exception in invoking authentication handler unidentifiable C++ exception”
  16. php面试 猴子大王,php猴子选大王问题解决方法,猴子大王_PHP教程
  17. word目录如何取消某级标题的页码
  18. Leetcode力扣 MySQL数据库 1468 计算税后工资
  19. 扫地阿姨看完都学会了!java全栈是什么意思
  20. c和python的优缺点_Python语言有什么优缺点?

热门文章

  1. Windows NT File System Internals----Chapter 5 The NT Virtual Memory Manage
  2. 优酷视频手机电脑同步站自适应宽高度的方法!
  3. 掌握软文营销三要素成功写出说服力文案
  4. php开发小型商务网站,基于PHP的校园小型商务网站设计──校园服务平台-论文...
  5. 学习英文-学以致用【场景:餐厅】
  6. 怎么把Firefox浏览器设为Windows系统默认浏览器?
  7. 【UVM源码学习】uvm_resource_db
  8. 向设计师推荐30款很酷的复古字体
  9. oracle update inner join,在Oracle上使用inner join更新语句
  10. 什么是更“中国”的漫画?