
php中addslashes函数与sql防注入。具体分析如下:
addslashes可会自动给单引号,双引号增加\\\\\\,这样我们就可以安全的把数据存入数据库中而不黑客利用,参数'az'界定所有大小写字母均被转义,代码如下:
复制代码 代码如下:
echo addcslashes('foo[ ]','az'); //输出:foo[ ]
$str="is your name o'reilly"; //定义字符串,其中包括需要转义的字符
echo addslashes($str); //输出经过转义的字符串
定义和用法:addslashes() 函数在指定的预定义字符前添加反斜杠
这些预定义字符是:单引号 ('),双引号 ("),反斜杠 (),null
语法:addslashes(string),当然这个函数更安全,实例代码如下:
复制代码 代码如下:
$str="<a href='test'>test</a>"; //定义包含特殊字符的字符串
$new=htmlspecialchars($str,ent_quotes); //进行转换 *** 作
echo $new; //输出转换结果
//不过输出时要用到
$str="jane & 'tarzan'"; //定义html字符串
echo html_entity_decode($str); //输出转换后的内容
echo "<br/>";
echo html_entity_decode($str,ent_quotes); //有可选参数输出的内容
一般思路就是这样。
但如果过滤太多字符,那你网站的正常使用也会受到很大影响。
php的addslashes()可以实现你所说的功能,但当你的SQL语句为$sql="select from article where id="$_GET['id'];时,过滤单引号什么的就不会起到什么作用。
再者,即使你的SQL语句换为$sql="select from article where id='{$_GET['id']}'";也不见得保险。提交/tphpid=%cf' or 1=1--%20也可以注入。具体可以百度一下双字节漏洞。
不过SQL注入也不是什么可怕的东西。例如对于要获取的数值数据,使用intval()过直接(int) $str;就可杜绝。对于字符变量就要注意了,要认真设置好数据库编码等等。
如果有好的编程习惯,注入什么的都不会怕滴。我也是php学习者,用php写了个博客>
可以通过占位的方法防注入
$pdo = new PDO("mysql:host=localhost;dbname=XXXX","root","");
$query = "INSERT INTO 数据表名(XXX,XXX,XXX) VALUES(,,)";
$stmt = $pdo->prepare($query);
$stmt -> execute(array("张三","李四","王五"));
1post数据
封装转义函数 防sql注入 eag:addslashes($username);addslashes($password);
eag:防止sql注入函数封装
function deepslashes($data){
#判断$data的表现形式 并且需要处理空的情况
if(empty($data)){
return($data);
}
#高级简写 return is_array($data) array_map('deepslashes',$data) : addslashes($data);
#初级写法
if(is_array($data)){
#递归循环遍历处理多维数组
foreach ($data as $v) {
return deepslashes($v);
}
}else{
#单一变量
return addslashes($data);
}
#初级写法
}
2get数据
指url 传参数导致sql发生改变
解决方案
①强制转换,使用函数intval 或者 数据类型 的关键字int
②隐式转换,通过运算,只需要+0即可
3xss跨站脚本攻击
指恶意攻击向web页面插入html、js标签导致页面出现错误
解决方案
转义标签'<' '>'即可,有以下php函数可解决
htmlspecialchars 函数 和 htmlentites函数
eag:
function deepslashes($data){
#判断$data的表现形式 并且需要处理空的情况
if(empty($data)){
return($data);
}
return is_array($data) array_map('deepslashes',$data) : htmlspecialchars ($data);
}
注入式攻击的类型
可能存在许多不同类型的攻击动机,但是乍看上去,似乎存在更多的类型。这是非常真实的-如果恶意用户发现了一个能够执行多个查询的办法的话。本文后面,我们会对此作详细讨论。
如
果你的脚本正在执行一个SELECT指令,那么,攻击者可以强迫显示一个表格中的每一行记录-通过把一个例如 =1这样的条件注入到WHERE子句中,如下所示(其中,注入部分以粗体显示):
SELECTFROMsitesWHEREsite='html580com'OR1=1;'
正如我们在前面所讨论的,这本身可能是很有用的信息,因为它揭示了该表格的一般结构(这是一条普通的记录所不能实现的),以及潜在地显示包含机密信息的记录。
一条更新指令潜在地具有更直接的威胁。通过把其它属性放到SET子句中,一名攻击者可以修改当前被更新的记录中的任何字段,例如下面的例子(其中,注入部分以粗体显示):
UPDATEsitesSETsite='diygwcom'WHERE=
site='html580com'
通过把一个例如1=1这样的恒真条件添加到一条更新指令的WHERE子句中,这种修改范围可以扩展到每一条记录,例如下面的例子:
UPDATEsitesSETsite='diygwcom'WHERE=
site='html580comOR1=1;'
最危险的指令可能是DELETE-这是不难想像的。其注入技术与我们已经看到的相同-通过修改WHERE子句来扩展受影响的记录的范围,例如下面的例子:
DELETEFROMsitesSETsite='diygwcom'WHERE=
site='html580comOR1=1;
具体用法
addslashes防止SQL注入
虽然国内很多PHP程序员仍在依靠addslashes防止SQL注入 还是建议大家加强中文防止SQL注入的检查 addslashes的问题在 于黑客 可以用 xbf 来代替单引号 而addslashes只是将 xbf 修改为 xbf c 成为一个有效的多字节字符 其中的 xbf c仍会 被看作是单引号 所以addslashes无法成功拦截
当然addslashes也不是毫无用处 它是用于单字节字符串的处理 多字节字符还是用mysql_real_escape_string吧
另外对于php手册中get_magic_quotes_gpc的
举例
代码如下<php function post_check($post) { if (!get_magic_quotes_gpc()) // 判断magic_quotes_gpc是否为打开 { $post = addslashes($post); // 进行magic_quotes_gpc没有打开的情况对提交数据的过滤 } $post = str_replace("_" "_" $post); // 把 _ 过滤掉 $post = str_replace("%" "%" $post); // 把 % 过滤掉 $post = nl br($post); // 回车转换 $post= specialchars($post); // 标记转换 return $post; } >
或
<php function inject_check($sql_str) { return eregi( select|insert|update|delete| | function verify_id($id=null) { if (!$id) { exit( 没有提交参数! ); } // 是否为空判断 elseif (inject_check($id)) { exit( 提交的参数非法! ); } // 注射判断 elseif (!is_numeric($id)) { exit( 提交的参数非法! ); } // 数字判断 $id = intval($id); // 整型化 return $id; } >
string mysql_real_escape_string ( string $unescaped_string [ resource $link_identifier ] )
本函数将 unescaped_string 中的特殊字符转义 并计及连接的当前字符集 因此可以安全用于 mysql_query()
Note: mysql_real_escape_string() 并不转义 % 和 _
mysql_real_escape_string
Example# mysql_real_escape_string() 例子
代码如下<php $item = "Zak s and Derick s Laptop" ; $escaped_item = mysql_real_escape_string ( $item ); printf ( "Escaped string: %sn" $escaped_item ); >
以上例子将产生如下输出
Escaped string: Zak s and Derick s Laptop
mysql_escape_string
本函数将 unescaped_string 转义 使之可以安全用于 mysql_query()
注: mysql_escape_string() 并不转义 % 和 _
本函数和 mysql_real_escape_string() 完全一样 除了 mysql_real_escape_string() 接受的是一个连接句柄并根据当前字符集转移字符串之外 mysql_escape_string() 并不接受连接参数 也不管当前字符集设定
例子 mysql_escape_string() 例子
代码如下<php $item = "Zak s Laptop"; $escaped_item = mysql_escape_string($item); printf ("Escaped string: %sn" $escaped_item); > 输出 Escaped string: Zak s Laptop
mysql_real_escape_string和mysql_escape_string这 个函数的区别
mysql_real_escape_string 必须在(PHP >= PHP )的情况下才能使用 否则只能用 mysql_escape_string 两者的区别是 mysql_real_escape_string 考虑到连接的当前字符集 而mysql_escape_string 不考虑
我们可以利用判断来综合处理
代码如下 function cleanuserinput($dirty){ if (get_magic_quotes_gpc()) { $clean = mysql_real_escape_string(stripslashes($dirty)); }else{ $clean = mysql_real_escape_string($dirty); } return $clean; }总结一下
addslashes() 是强行加;
mysql_real_escape_string() 会判断字符集 但是对PHP版本有要求;
lishixinzhi/Article/program/PHP/201311/21094
以上就是关于addslashes用途与php怎样防止mysql注入全部的内容,包括:addslashes用途与php怎样防止mysql注入、关于php mysql 防注入,我的思路,求指点、php怎么实现SQL防注入的方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)