PHP防SQL注入不要再用addslashes和mysql_real_escape_string
PHP防SQL注入不要再用addslashes和mysql_real_escape_string了,有需要的朋友可以参考下。
博主热衷各种互联网技术,常啰嗦,时常伴有强迫症,常更新,觉得文章对你有帮助的可以关注我。 转载请注明"深蓝的镰刀"
看了很多PHP网站在防SQL注入上还在使用addslashes和str_replace,百度一下"PHP防注入"也同样在使用他们,实践发现就连mysql_real_escape_string也有黑客可以绕过的办法,如果你的系统仍在用上面三个方法,那么我的这篇博文就有了意义,以提醒所有后来者绕过这个坑。
出于为后人栽树而不是挖坑的考虑,给出PHP以及MYSQL的版本信息,以免将来“问题”不再是“问题”了。
用str_replace以及各种php字符替换函数来防注入已经不用我说了,这种“黑名单”式的防御已经被证明是经不起时间考验的。
下面给出绕过addslasher和mysql_real_escape_string的方法(Trick)。
注意:虽然在MYSQL5.5.37-log下该Trick已经被修复了,但仍然没有确切地解决注入问题,介于很多公司的系统仍在使用Mysql5.0,我建议立马做出改进,这点也是我《也说说几种让程序员快速提高能力的方法
》中提到的一个十分重要的点。
注意:如果你不确定你的系统是否有SQL注入的风险,请将下面的下面的DEMO部署到你的服务器,如果运行结果相同,那么请参考最后的完美的解决方案。
MYSQL:
mysql> select version(); +---------------------+ | version() | +---------------------+ | 5.0.45-community-ny | +---------------------+ 1 row in set (0.00 sec) mysql> create database test default charset GBK; Query OK, 1 row affected (0.00 sec) mysql> use test; Database changed mysql> CREATE TABLE users (username VARCHAR(32) CHARACTER SET GBK,password VARCHAR(32) CHARACTER SET GBK,PRIMARY KEY (username) ); Query OK, 0 rows affected (0.02 sec) mysql> insert into users SET username='ewrfg', password='wer44'; Query OK, 1 row affected (0.01 sec) mysql> insert into users SET username='ewrfg2', password='wer443'; Query OK, 1 row affected (0.01 sec) mysql> insert into users SET username='ewrfg4', password='wer4434'; Query OK, 1 row affected (0.01 sec)=
PHP:
<?php echo "PHP version: ".PHP_VERSION."\n";mysql_connect('servername','username','password'); mysql_select_db("test"); mysql_query("SET NAMES GBK");$_POST['username'] = chr(0xbf).chr(0x27).' OR username = username /*'; $_POST['password'] = 'guess';$username = addslashes($_POST['username']); $password = addslashes($_POST['password']); $sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'"; $result = mysql_query($sql) or trigger_error(mysql_error().$sql);var_dump(mysql_num_rows($result)); var_dump(mysql_client_encoding());$username = mysql_real_escape_string($_POST['username']); $password = mysql_real_escape_string($_POST['password']); $sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'"; $result = mysql_query($sql) or trigger_error(mysql_error().$sql);var_dump(mysql_num_rows($result)); var_dump(mysql_client_encoding());mysql_set_charset("GBK"); $username = mysql_real_escape_string($_POST['username']); $password = mysql_real_escape_string($_POST['password']); $sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'"; $result = mysql_query($sql) or trigger_error(mysql_error().$sql);var_dump(mysql_num_rows($result)); var_dump(mysql_client_encoding());
结果:
PHP version: 5.2.5 int(3) string(6) "latin1" int(3) string(6) "latin1" int(0) string(3) "gbk"
可以看出来不论是使用addslashes还是mysql_real_escape_string,我都可以利用编码的漏洞来实现输入任意密码就能登录服务器的注入攻击!!!!(攻击的原理我就不多说了,感兴趣的同学可以研究下字符编码中单字节和多字节的问题)
注意:第三个mysql_real_escape_string之所以能够防注入是因为mysql_escape_string本身并没办法判断当前的编码,必须同时指定服务端的编码和客户端的编码,加上就能防编码问题的注入了。虽然是可以一定程度上防止SQL注入,但还是建议以下的完美解决方案。
完美解决方案就是使用拥有Prepared Statement机制的PDO和MYSQLi来代替mysql_query(注:mysql_query自 PHP 5.5.0 起已废弃,并在将来会被移除):
PDO:
$pdo = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute(array('name' => $name));foreach ($stmt as $row) {// do something with $row }
MYSQLi:
$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?'); $stmt->bind_param('s', $name);$stmt->execute();$result = $stmt->get_result(); while ($row = $result->fetch_assoc()) {// do something with $row }
转载于:https://www.cnblogs.com/yubolin/p/6050010.html
PHP防SQL注入不要再用addslashes和mysql_real_escape_string相关推荐
- php mysql 防 sql注入_php 防sql注入方法
php防sql注入的方法:1.使用mysql_real_escape_string方法转义SQL语句中使用的字符串中的特殊字符:2.打开magic_quotes_gpc来防止SQL注入:3.通过自定义 ...
- .NET防SQL注入方法
SQL语句 利用SqlCommand传参数的方法: string strSQL="SELECT * FROM [user] WHERE user_id=@id"; SqlCom ...
- tp5防止sql注入mysql_TP5框架 《防sql注入、防xss攻击》
版权声明:本文为博主原创文章,转载请注明原文出处! https://blog.csdn.net/qq_23375733/article/details/86606630 如题:tp5怎么防sql注入 ...
- php用于防SQL注入的几个函数
用于防SQL注入的几个函数 不要相信用户的在登陆中输入的内容,需要对用户的输入进行处理 SQL注入: ' or 1=1 # 防止SQL注入的几个函数: addslashes($string):用反斜线 ...
- php 完美防sql注入,PHP 完美的防XSS 防SQL注入的代码
PHP "完美"的防XSS 防SQL注入的代码 function gjj($str) { $farr = array( "/s+/", "/]*?)& ...
- php文件防删改,PHP实现增删改查以及防SQL注入
最近项目调研时,需要在集成板子上做个配置的网页,板子上装的是linux系统,配置信息在一个SQLite数据库中,经过讨论大家决定用PHP做这个网页.由于项目组没一个会PHP的,所以安排我调研下写个De ...
- php判断post是否xss,PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】...
本文实例讲述了PHP实现表单提交数据的验证处理功能.分享给大家供大家参考,具体如下: 防XSS攻击代码: /** * 安全过滤函数 * * @param $string * @return strin ...
- C# 检查字符串,防SQL注入攻击(转载)
这些天,CSDN上讨论SQL注入攻击似乎是如火如荼啊...我也来参合一下..如下,CheckParams函数,接收参数任意,如参数中有字符串,则对字符串进行检查,如参数中有集合(如Array之类,总之 ...
- 防SQL注入(转载)
这些天,CSDN上讨论SQL注入攻击似乎是如火如荼啊...我也来参合一下..如下,CheckParams函数,接收参数任意,如参数中有字符 串,则对字符串进行检查,如参数中有集合(如Array之类,总 ...
最新文章
- 把控制台程序嵌入到 WinForm 中执行
- Wpf体系结构的学习
- OCM备考 一、Server config 之配置shared server
- 课堂练习之四则运算加强版
- 产品经理被老板打住院
- 12.混淆——数字音频采样,混淆,反混淆,脉冲序列_2
- Solr相关概念详解:SolrRequestHandler
- lisp画垫圈_晓东CAD家园-论坛-LISP/VLISP程序库-[LISP程序]:俺的画内六角圆柱头螺钉的LISP程序-见附件 - Powered by Discuz!...
- python入门指南全文阅读-Python-3.4-入门指南(官方中文版).pdf
- Thread源码-----传实现了Runnable接口的类的实例给Thread的作用
- myecplise 完全开发
- DeepStream中,获得并修改识别对象参数的代码
- 利率模型暗示美国股市是合理价值(仅做参考)
- 2022年电工杯数模竞赛B题第一问解法分享(附Python代码)
- 搭建ELK-流水账-只记思路
- 混合线性模型笔记1:模型假定
- 桌面计算机图标变成文件夹,电脑桌面图标全部变成白色文件了怎么办
- 关于华为手机P20pro装包时总提示冲突问题
- 前有莫雷,今有清华学霸要求公开华人程序员自杀真相,被Facebook开除了
- 【ketlle】本地开发kitlle job提交至linux生产环境上执行流程
热门文章
- python培训班 北京-北京python培训班哪家好
- 国内哪里培训python比较好-python培训哪家机构比较好?
- python软件开发-如何编写Python软件开发文档(7个技巧)
- 快速排序 python菜鸟教程-NumPy 排序、条件刷选函数
- LeetCode Single Number II(位操作)
- LeetCode Best Time to Buy and Sell Stock(dp)
- Activity的使用(四):两个activity的交互
- vue 使用font-awesome
- php 按汉字首字母查询[转载]
- 基于MD5的增强型摘要算法