PHPmysql_real_escape_string()函数防SQL注⼊定义和⽤法
mysql_real_escape_string() 函数转义 SQL 语句中使⽤的字符串中的特殊字符。
下列字符受影响:
\x00
\n
\r
\
'
"
\x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
语法
mysql_real_escape_string(string,connection)
参数描述
string必需。规定要转义的字符串。
connection可选。规定 MySQL 连接。如果未规定,则使⽤上⼀个连接。
说明
本函数将string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全⽤于。
提⽰和注释
提⽰:可使⽤本函数来预防数据库攻击。
例⼦
例⼦ 1
<?php
$con = mysql_connect("localhost", "hello", "321");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
php修改数据库内容// 获得⽤户名和密码的代码
// 转义⽤户名和密码,以便在 SQL 中使⽤
$user = mysql_real_escape_string($user);
$pwd = mysql_real_escape_string($pwd);
$sql = "SELECT * FROM users WHERE
user='" . $user . "' AND password='" . $pwd . "'"
// 更多代码
mysql_close($con);
>
例⼦ 2
数据库攻击。本例演⽰如果我们不对⽤户名和密码应⽤ mysql_real_escape_string() 函数会发⽣什么:
<?php
$con = mysql_connect("localhost", "hello", "321");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
$sql = "SELECT * FROM users
WHERE user='{$_POST['user']}'
AND password='{$_POST['pwd']}'";
mysql_query($sql);
// 不检查⽤户名和密码
// 可以是⽤户输⼊的任何内容,⽐如:
$_POST['user'] = 'john';
$_POST['pwd'] = "' OR ''='";
// ⼀些代码...
mysql_close($con);
>
那么 SQL 查询会成为这样:
SELECT * FROM users
WHERE user='john' AND password='' OR ''=''
这意味着任何⽤户⽆需输⼊合法的密码即可登陆。
例⼦ 3
预防数据库攻击的正确做法:
<?php
function check_input($value)
{
// 去除斜杠
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
// 如果不是数字则加引号
if (!is_numeric($value))
{
$value = "'" . mysql_real_escape_string($value) . "'";
}
return $value;
}
$con = mysql_connect("localhost", "hello", "321");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
// 进⾏安全的 SQL
$user = check_input($_POST['user']);
$pwd = check_input($_POST['pwd']);
$sql = "SELECT * FROM users WHERE
user=$user AND password=$pwd";
mysql_query($sql);
mysql_close($con);
>
//----------------------------------------------
以前还真没有关注过这⾯的事情。⾃⼰在写的时候都是⽤了⼀个很简单的函数
PHP代码
1. <?php
2. function escape($str){
3. if(function_exists('mysql_escape_string')){
4. return mysql_escape_string($str);
5. }elseif( function_exists(...)){
6. //real_escape
7. }else{
8. if(MAGIC_QUOTER ....判断){
9. return $str
10. }else{
11. return addslashes($str);
12. }
13. }
14. }
但是这篇⽂章却告诉我,原来这三个函数的功能各有不同,前两个我当然知道,但如果没有加载mysql库,这两个功能是都⽤不上的,当然,现在有PDO的prepare然后setParam当然是很⽅便,mysqli函数也有这种功能。如果没有呢?怎么办?下⾯这篇⽂章告诉你上⾯三个函
数的区别
来源:/2009-08/php-in-the-addslashes-mysql_real_escape_string-and-mysql_escape_string-the-difference-between/ SQL注⼊攻击是⿊客攻击⽹站最常⽤的⼿段。如果你的站点没有使⽤严格的⽤户输⼊检验,那么常容易遭到SQL注⼊攻击。SQL注⼊攻击通常通过给站点数据库提交不良的数据或查询语句来实现,很可能使数据库中的纪录遭到暴露,更改或被删除。
为了防⽌SQL注⼊攻击,PHP⾃带⼀个功能可以对输⼊的字符串进⾏处理,可以在较底层对输⼊进⾏安全上的初步处理,也即Magic Quotes。(php.ini magic_quotes_gpc)。如果magic_quotes_gpc选项启⽤,那么输⼊的字符串中的单引号,双引号和其它⼀些字符前将会被⾃动加上反斜杠\。
但Magic Quotes并不是⼀个很通⽤的解决⽅案,没能屏蔽所有有潜在危险的字符,并且在许多服务器上Magic Quotes并没有被启⽤。所以,我们还需要使⽤其它多种⽅法来防⽌SQL注⼊。
许多数据库本⾝就提供这种输⼊数据处理功能。例如PHP的MySQL操作函数中有addslashes()、 mysql_real_escape_string()、
mysql_escape_string()等函数,可将特殊字符和可能引起数据库操作出错的字符转义。那么这三个功能函数之间有什么却别呢?下⾯我们就来详细讲述下。
虽然国内很多PHP程序员仍在依靠addslashes防⽌SQL注⼊,还是建议⼤家加强中⽂防⽌SQL注⼊的
检查。addslashes的问题在于⿊客可以⽤0xbf27来代替单引号,⽽addslashes只是将0xbf27修改为0xbf5c27,成为⼀个有效的多字节字符,其中的0xbf5c仍会被看作是单引号,所以addslashes⽆法成功拦截。
当然addslashes也不是毫⽆⽤处,它是⽤于单字节字符串的处理,多字节字符还是⽤mysql_real_escape_string吧。
另外对于php⼿册中get_magic_quotes_gpc的举例:
if (!get_magic_quotes_gpc()) {
$lastname = addslashes($_POST[‘lastname’]);
} else {
$lastname = $_POST[‘lastname’];
}
最好对magic_quotes_gpc已经开放的情况下,还是对$_POST[’lastname’]进⾏检查⼀下。
再说下mysql_real_escape_string和mysql_escape_string这2个函数的区别:
mysql_real_escape_string 必须在(PHP 4 >= 4.3.0, PHP 5)的情况下才能使⽤。否则只能⽤ mysql_escape_string ,两者的区别是:mysql_real_escape_string 考虑到连接的当前字符集,⽽mysql_escape_string 不考虑。
总结⼀下:
* addslashes() 是强⾏加\;
* mysql_real_escape_string() 会判断字符集,但是对PHP版本有要求;
* mysql_escape_string不考虑连接的当前字符集。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论