addslashes用途与php怎样防止mysql注入

addslashes用途与php怎样防止mysql注入,第1张

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防注入的方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9418825.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存