mysql addslashes_PHP函数addslashes和mysql_real_escape_string的区别

首先:不要使用mysql_escape_string,它已被弃用,请使用mysql_real_escape_string代替它。

mysql_real_escape_string和addslashes的区别在于:

区别一:addslashes不知道任何有关MySQL连接的字符集。如果你给所使用的MySQL连接传递一个包含字节编码之外的其他编码的字符串,它会很愉快地把所有值为字符‘、“、\和\x00的字节进行转义。如果你正在使用不同于8位和UTF-8的其它字符,这些字节的值不一定全部都是表示字符‘、“、\和\x00。可能造成的结果是,MySQL接收这些字符后出现错误。

如果要修正这个bug,可尝试使用iconv函数,将变量转为UTF-16,然后再使用addslashes进行转义。

这是不使用addslashes进行转义的原因之一。

区别二:

与addslashes对比,mysql_real_escape_string同时还对\r、\n和\x1a进行转义。看来,这些字符必须正确地告诉MySQL,否则会得到错误的查询结果。

这是不使用addslashes进行转义的另一个原因。

addslashes V.S. mysql_real_escape_string

在GBK里,0xbf27不是一个合法的多字符字符,但0xbf5c却是。在单字节环境里,0xbf27被视为0xbf后面跟着0×27(‘),同时0xbf5c被视为0xbf后面跟着0x5c(\)。

一个用反斜杠转义的单引号,是无法有效阻止针对MySQL的SQL注入攻击的。如果你使用addslashes,那么,我(攻击者,下同)是很幸运的。我只要注入一些类似0xbf27,然后addslashes将它修改为0xbf5c27,一个合法的多字节字符后面接着一个单引号。换句话说,我可以无视你的转义,成功地注入一个单引号。这是因为0xbf5c被当作单字节字符,而非双字节。

在这个演示中,我将使用MySQL 5.0和PHP的mysqli扩展。如果你想尝试,请确保你使用GBK。

创建一个名为users的表:

代码如下:

CREATE TABLEusers(

usernameVARCHAR(32) CHARACTER SETGBK,

passwordVARCHAR(32) CHARACTER SETGBK,PRIMARY KEY(username)

);

下面的代码模拟只使用addslashes(或magic_quotes_gpc)对查询数据进行转义时的情况:

代码如下:

<?php $mysql = array();$db = mysqli_init();$db->real_connect('localhost', 'lorui', 'lorui.com', 'lorui_db');/*SQL注入示例*/

$_POST['username'] = chr(0xbf) . chr(0×27) . ‘ OR username = username /*'; $_POST['password'] = ‘guess'; $mysql['username'] = addslashes($_POST['username']); $mysql['password'] = addslashes($_POST['password']); $sql = “SELECT * FROM users WHERE username = ‘{$mysql['username']}' AND password = ‘{$mysql['password']}'”; $result = $db->query($sql); if ($result->num_rows) { /* 成功*/ } else { /*失败*/ }

尽管使用了addslashes,我还是可以在不知道用户名和密码的情况下成功登录。我可以轻松的利用这个漏洞进行SQL注入。

要以免这种漏洞,使用mysql_real_escape_string、准备语句(Prepared Statements,即“参数化查询”)或者任意一款主流的数据库抽象类库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264658.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebBrowser 控件 内存溢出 补丁 From Microsoft

在程序中用WebBrowser长时间不停访问不同页面会造成内存溢出&#xff0c;微软给出了补丁&#xff0c;但是似乎没有怎么测试。要获得补丁必须通过邮件申请&#xff0c;我申请了三次才凑够了XP&#xff0c;2003和Vista的补丁&#xff0c;给大家分享。不过微软说没有经过回归测试&…

C#中如何得到Graphics对象

2019独角兽企业重金招聘Python工程师标准>>> 利用Graphics对象&#xff0c;我们可以绘制理想的UI。这里首先介绍C#中如何得到Graphics对象。 /如何得到Graphics对象 1. Control.CreateGraphics();直接通过Control类的公开方法获取。可以是Form&#xff0c;基础控件&…

【Lucene4.8教程之中的一个】使用Lucene4.8进行索引及搜索的基本操作

版权声明&#xff1a;本文为博主原创文章。转载请注明来自http://blog.csdn.net/jediael_lu/ https://blog.csdn.net/jediael_lu/article/details/30035025 在Lucene对文本进行处理的过程中&#xff0c;能够大致分为三大部分&#xff1a; 1、索引文件&#xff1a;提取文档内容并…

mysql 5.5 创建用户_MySQL5.5以上版本添加用户

MySQL数据库在5.5以后的版本对添加用户的操作进行了改版&#xff0c;已经不能使用原有的添加语法操作。MySQL数据库5.6版本变更&#xff1a;在数据库用户这一块&#xff0c;为了数据安全&#xff0c;5.6版本不在允许root用户通过insert语句对user表进行添加用户如图报错语法貌似…

discuz!nt论坛搬迁后出错,提示:对象名 'dnt_templates' 无效

2007年10月30日 星期二 16:23对象名 dnt_templates 无效解决方法&#xff1a; --解决重装系统并还原论坛数据库后&#xff0c;数据库帐号不关联的问题。--注意请用sa帐号 进行如下操作--操作之前&#xff0c;确保当前SqlServer中存在和原来数据库所有者同名的帐号 Exec sp_conf…

linux和windows双系统互拷文件乱码问题

2019独角兽企业重金招聘Python工程师标准>>> 如果你需要在linux下面用到windows下的文件&#xff0c;拷贝上去后经常发现中文显示乱码。。原因是Windows中默认的文件格式是 GBK(gb2312)&#xff0c;而Linux一般都是UTF-8。比较繁琐的方法是在windows下用程序把内容转…

LOJ2195 旅行

LOJ2195 旅行 题目描述S 国有 N 个城市&#xff0c;编号从 1 到 N。城市间用 N-1 条双向道路连接&#xff0c;满足从一个城市出发可以到达其它所有城市。每个城市信仰不同的宗教&#xff0c;如飞天面条神教、隐形独角兽教、绝地教都是常见的信仰。为了方便&#xff0c;我们用不…

System variables, logging and the Execute SQL Task...(zz)

原文地址http://sqljunkies.com/WebLog/knight_reign/archive/2005/02/27/8187.aspxHeres something useful you can do with system variables and the SQL Task. Logging in SSIS is more flexible and there are more options for logging destinations and formats then wi…

mysql linux文件_MySQL在Linux系统下配置文件详解

在日常的的开发过程中接触到了SQLServer和MySQL数据库的操作性问题&#xff0c;可能是以前接触的都是SQL Server&#xff0c;才开始接触MySQL&#xff0c;总感觉使用MySQL没有使用SQLserver那么顺手&#xff0c;一些关键的系统函数&#xff0c;比如说开窗、行转列、列转行、自增…

logger

log4j日志配置关键字: apache log4j 1、配置根Logger:log4j.rootLogger [ level ] , appenderName, appenderName2level&#xff1a;日志的级别&#xff0c;指定这条日志信息的重要性。分为ALL < DEBUG < INFO < WARN 一般常用的为 DEBUG &#xff0c; INFO &#xf…

如何实现从wgs-84到beijing54的坐标转换

摘要&#xff1a;关于这个坐标系的转化网上有很多文章探讨了各种转换的方法。通过自己的学习&#xff0c;我自己做了一下总结&#xff0c;同时给出了其中要遇到的部分术语和数据&#xff0c;方便以后查阅使用。主要介绍的是&#xff1a;3参数&#xff08;七参数&#xff09;转换…

增删改查(curd)

curd的解释: 代表创建&#xff08;Create&#xff09;、更新&#xff08;Update&#xff09;、读取&#xff08;Retrieve&#xff09;和删除&#xff08;Delete&#xff09; 查询基本使用 查询所有列select * from 表名; 例&#xff1a; select * from classes; 查询指定列可以…

mysql group by 别名_[转]为什么group by后面不能使用别名(除MySQL)

同事工作中遇到一个问题&#xff1a;select count(billingdate),to_char(billingdate,YYYYmm) monthfrom tu_tradewhere to_char(billingdate,YYYY) 2017and reportstat 30group by month;-----执行报错&#xff0c;cant resolve month............因为Sql语句执行顺序(7) …

R内存扩展 win7内存扩展

安装包 imdiskinst 文件 램디스크 사용http://www.ltr-data.se/ http://cruciancar.blog.me/150101634586 --TEMP 변수 TEMP,TMP%USERPROFILE%\AppData\Local\Temp%USERPROFILE%\AppData\Local\Temp --Licensehttp://linsoo.co.kr/2281 --추가imdisk.exe -a -t vm -m r: -s 102…

POJ 1150 The Last Non-zero Digit 数论+容斥

POJ 1150 The Last Non-zero Digit 数论容斥 题目地址: POJ 1150 题意&#xff1a; 求排列P(n, m)后面第一个非0的数。 分析&#xff1a; 为了熟悉题目中的理论。我先做了俩0基础的题目&#xff1a; POJ 1401。题解见&#xff1a;POJ 1401 && ZOJ 2202 Factorial 阶乘…

redis mysql原理_MYSQL MONGODB REDIS 同步原理以及高可用性对比

MySQL1、异步复制&#xff1a;2、半同步复制&#xff1a;同步出现超时后会自动变回异步复制&#xff1b;MongoDBMongoDB的副本集是一组mongod进程的集合&#xff0c;提供冗余和高可用性。最小的的副本集包含(1个primary、1个secondary和1个arbiter)&#xff0c;大多数的部署包含…

使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性...

<system.web.extensions><scripting><webServices><jsonSerialization maxJsonLength"1024000" /></webServices></scripting> </system.web.extensions> 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错。字…

XML数据岛(XML Data Island)(只适用于ie)

< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> 在Microsoft Internet Explorer 5.0及以后的版本里里&#xff0c;你可以利用XML元素来创建数据岛&#xff0c;数据岛就是被HTML页面引用或包含的XML数据&#xff0c;XML数据可以包含…

并不对劲的bzoj3994:loj2185:p3327[SDOI2015]约数个数和

题目大意 设d(x)为x的约数个数&#xff0c;\(t\)组询问&#xff0c;给定\(n,m\)(\(t,m,n\leq5*10^4\))&#xff0c;求$ \sum^n_{i1}\sum^m_{j1}d(i*j)$ 题解 假设\(n\leq m\) 设\(ip_1^{a_1}*p_2^{a_2}*...*p_k^{a_k},jp_1^{b_1}*p_2^{b_2}*...*p_k^{b_k}\) 对于\(i*j\)的某个约…

mysql redo原子写_InnoDB如何保证redolog的完整性?

redo log里记录的只是对数据库页面的更改&#xff0c;它记录着类似『更改页面x 的指定偏移量的数据为k』这样的信息&#xff0c;是完全二进制的log(数据库原理概念上的&#xff0c;不是指MySQL binlog&#xff0c;MySQL binlog不是二进制log)&#xff1b;在redo log里并没有存储…