PHP登录中的防止sql注入方法分析
比如以下一段登录的代码:
代码如下 | 复制代码 |
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样式标签
代码如下 | 复制代码 |
|
这样即可了哦。
相关文章
- PHPEMS(PHP Exam Management System)在线模拟考试系统基于PHP+Mysql开发,主要用于搭建模拟考试平台,支持多种题型和展现方式,是国内首款支持题冒题和自动评分与教师评分相...2016-11-25
- SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作 标准注入语句1.判...2016-11-25
php 中file_get_contents超时问题的解决方法
file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。...2016-11-25- 防止SQL注入是我们程序开发人员必须要做的事情了,今天我们就来看一篇关于PHP防止SQL注入的例子了,具体的实现防过滤语句可以参考下面来看看吧。 使用prepared以及参...2016-11-25
- php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
- 相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
- 下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
- 在很多网站用户先访问一个要登录的页面,但当时没有登录后来登录了,等待用户登录成功之后肯定希望返回到上次访问的页面,下面我就来给大家介绍登录后跳转回原来要访问的页...2016-11-25
- ps软件是现在非常受大家喜欢的一款软件,有着非常不错的使用功能。这次文章就给大家介绍下ps把文字背景变透明的操作方法,喜欢的一起来看看。 1、使用Photoshop软件...2017-07-06
intellij idea快速查看当前类中的所有方法(推荐)
这篇文章主要介绍了intellij idea快速查看当前类中的所有方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-09-02- 1.在没有设置默认值的情况下: 复制代码 代码如下:SELECT userinfo.id, user_name, role, adm_regionid, region_name , create_timeFROM userinfoLEFT JOIN region ON userinfo.adm_regionid = region.id 结果:...2014-05-31
js导出table数据到excel即导出为EXCEL文档的方法
复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta ht...2013-10-13- 本文章完美的利用了php的curl功能实现模拟登录discuz以及模拟发帖,本教程供参考学习哦。 代码如下 复制代码 <?php $discuz_url = ‘ht...2016-11-25
- 批量更新mysql更新语句很简单,更新一条数据的某个字段,一般这样写:复制代码 代码如下:UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';如果更新同一字段为同一个值,mysql也很简单,修改下where即...2013-10-04
- ps软件是一款非常不错的图片处理软件,有着非常不错的使用效果。这次文章要给大家介绍的是ps怎么制作倒影,一起来看看设计倒影的方法。 用ps怎么做倒影最终效果̳...2017-07-06
- 本文涉及的主题虽然很基础,在许多人看来属于小伎俩,但在JavaScript基础知识中属于一个综合性的话题。这里会涉及到对象属性的封装、原型、构造函数、闭包以及立即执行表达式等知识。公有方法 公有方法就是能被外部访问...2015-11-08
安卓手机wifi打不开修复教程,安卓手机wifi打不开解决方法
手机wifi打不开?让小编来告诉你如何解决。还不知道的朋友快来看看。 手机wifi是现在生活中最常用的手机功能,但是遇到手机wifi打不开的情况该怎么办呢?如果手机wifi...2016-12-21- 最近想自学PHP ,做了个验证码,但不知道怎么搞的,总出现一个如下图的小红叉,但验证码就是显示不出来,原因如下 未修改之前,出现如下错误; (1)修改步骤如下,原因如下,原因是apache权限没开, (2)点击打开php.int., 搜索extension=ph...2013-10-04
- 单个字符分割 string s="abcdeabcdeabcde"; string[] sArray=s.Split('c'); foreach(string i in sArray) Console.WriteLine(i.ToString()); 输出下面的结果: ab de...2020-06-25
- javascript控制页面控件隐藏显示的两种方法,方法的不同之处在于控件隐藏后是否还在页面上占位 方法一: 复制代码 代码如下: document.all["panelsms"].style.visibility="hidden"; document.all["panelsms"].style.visi...2013-10-13