比如以下一段登录的代码:
代码如下 | 复制代码 |
if($l = @mysql_connect('localhost', 'root', '123')) or die('数据库连接失败'); mysql_select_db('test'); mysql_set_charset('utf8'); $sql = 'select * from test where username = "$username" and password = "$password"'; $res = mysql_query($sql); if(mysql_num_rows($res)){ header('Location:./home.php'); }else{ die('输入有误'); } |
注意上面的sql语句,存在很大的安全隐患,如果使用以下万能密码和万能用户名,那么可以轻松进入页面:
代码如下 | 复制代码 |
1. $sql = 'select * from test where username = "***" and password = "***" or 1 = "1"'; |
很明显,针对这条sql语句的万能密码是: ***" or 1 = "1
代码如下 | 复制代码 |
2. $sql = 'select * from test where username ="***" union select * from users/* and password = "***"'; |
正斜线* 表示后面的不执行,mysql支持union联合查询, 所以直接查询出所有数据; 所以针对这条sql语句的万能用户名是:***" union select * from users/*
但是,此注入只针对代码中的sql语句,如果
代码如下 | 复制代码 |
$sql = "select * from test where username = $username and password = $password"; |
上面的注入至少已经不管用了,不过方法是一样的;
在使用PDO之后,sql注入完全可以被避免,而且在这个快速开发的时代,框架横行,已然不用过多考虑sql注入问题了。
下面整理了两个防止sql注册函数
代码如下 | 复制代码 |
/* 过滤所有GET过来变量 */ |
还有一些博客会这样写
代码如下 | 复制代码 |
<?php |
代码是最好的语言。。
代码如下 | 复制代码 |
<?php /** $token_time = time(); if ($_POST) { if ((time() – $_token_time) > $expire_time) { echo $_token; echo $_token_real; <!DOCTYPE html> <input type=”submit” name=”submit” id=”" value=”submit” /> </form> |
通过在你的表单中包括验证码,你事实上已经消除了跨站请求伪造攻击的风险。可以在任何需要执行操作的任何表单中使用这个流程
当然,将token 存储到session更好,这儿只是简单示例下
简单分析:
token防攻击也叫作(令牌)了,我们在用户访问页面时就生成了一个随机的token保存session与表单了,用户提交时如果我们获取到的token与session不一样就可以提交重新输入提交数据了
防止sql注入不但是新学的程序员朋友需要深入了解的一个重要知识点之外,还是我们这些写了多年程序的朋友也必须注意的东西,下面给新手介绍php 防止查询的sql攻击的一些例子,希望对各位会有所帮助。一个入门级别的例子
代码如下 | 复制代码 |
$k = $_REQUEST['k']; $k = addslashes($k);//转义:单引号,双引号,反斜线,NULL $k = str_replace('%', '\%', $k); $k = str_replace('_', '\_', $k); $sql = "select * from users where name like '%$k%'"; if(!empty($k)){ $res = mysql_query($sql, $con) or die(mysql_error()); if($row = mysql_fetch_assoc($res)){ foreach($row as $k=>$v){ echo $row[$k].':'.$row[$v].'<br />'; } } }else{ echo '******'; } |
补充
mysql_real_escape_string()
所以得SQL语句如果有类似这样的写法:
"select * from cdr where src =".$userId; 都要改成 $userId=mysql_real_escape_string($userId)
例子
代码如下 | 复制代码 |
<?php |
所有有打印的语句如echo,print等 在打印前都要使用htmlentities() 进行过滤,这样可以防止Xss,注意中文要写出
代码如下 | 复制代码 |
htmlentities($name,ENT_NOQUOTES,GB2312) 。 |
3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。
代码如下 | 复制代码 |
function encrypt($input){ function decrypt($encrypted){ function pkcs5_pad ($text, $blocksize) { function pkcs5_unpad($text){ function PaddingPKCS7($data) { 用法: $crypt = new Crypt3Des('密钥'); |
例子,使用strip_tags()函数过滤所有html
代码如下 | 复制代码 |
$str = '<a href="#">href</a>'; 输出结果为 <a href="#">href</a> href |
上面函数有一个问题就是包括html标签,img标签都过滤掉了,如果我们希望保留图片怎么办
在网上找到一个函数
代码如下 | 复制代码 |
function uh($str) |
这样就可以过滤指定标签了,上面方法还不会我们可参考下面办法
代码如下 | 复制代码 |
<br>$str=preg_replace("/\s+/", " ", $str); //过滤多余回车 <br>$str=preg_replace("/<[ ]+/si","<",$str); //过滤<__("<"号后面带空格) <br><br>$str=preg_replace("/<\!--.*?-->/si","",$str); //注释 <br>$str=preg_replace("/<(\!.*?)>/si","",$str); //过滤DOCTYPE <br>$str=preg_replace("/<(\/?html.*?)>/si","",$str); //过滤html标签 <br>$str=preg_replace("/<(\/?head.*?)>/si","",$str); //过滤head标签 <br>$str=preg_replace("/<(\/?meta.*?)>/si","",$str); //过滤meta标签 <br>$str=preg_replace("/<(\/?body.*?)>/si","",$str); //过滤body标签 <br>$str=preg_replace("/<(\/?link.*?)>/si","",$str); //过滤link标签 <br>$str=preg_replace("/<(\/?form.*?)>/si","",$str); //过滤form标签 <br>$str=preg_replace("/cookie/si","COOKIE",$str); //过滤COOKIE标签 <br><br>$str=preg_replace("/<(applet.*?)>(.*?)<(\/applet.*?)>/si","",$str); //过滤applet标签 <br>$str=preg_replace("/<(\/?applet.*?)>/si","",$str); //过滤applet标签 <br><br>$str=preg_replace("/<(style.*?)>(.*?)<(\/style.*?)>/si","",$str); //过滤style标签 <br>$str=preg_replace("/<(\/?style.*?)>/si","",$str); //过滤style标签 <br><br>$str=preg_replace("/<(title.*?)>(.*?)<(\/title.*?)>/si","",$str); //过滤title标签 <br>$str=preg_replace("/<(\/?title.*?)>/si","",$str); //过滤title标签 <br><br>$str=preg_replace("/<(object.*?)>(.*?)<(\/object.*?)>/si","",$str); //过滤object标签 <br>$str=preg_replace("/<(\/?objec.*?)>/si","",$str); //过滤object标签 <br><br>$str=preg_replace("/<(noframes.*?)>(.*?)<(\/noframes.*?)>/si","",$str); //过滤noframes标签 <br>$str=preg_replace("/<(\/?noframes.*?)>/si","",$str); //过滤noframes标签 <br><br>$str=preg_replace("/<(i?frame.*?)>(.*?)<(\/i?frame.*?)>/si","",$str); //过滤frame标签 <br>$str=preg_replace("/<(\/?i?frame.*?)>/si","",$str); //过滤frame标签 <br><br>$str=preg_replace("/<(script.*?)>(.*?)<(\/script.*?)>/si","",$str); //过滤script标签 <br>$str=preg_replace("/<(\/?script.*?)>/si","",$str); //过滤script标签 <br>$str=preg_replace("/javascript/si","Javascript",$str); //过滤script标签 <br>$str=preg_replace("/vbscript/si","Vbscript",$str); //过滤script标签 <br>$str=preg_replace("/on([a-z]+)\s*=/si","On\\1=",$str); //过滤script标签 <br>$str=preg_replace("/&#/si","&#",$str); //过滤script标签,如javAsCript:alert( <br> |
如果只要过滤过滤html标签,js代码,css样式标签
代码如下 | 复制代码 |
|
这样即可了哦。