PHP登录环节防止sql注入的方法浅析


Posted in PHP onJune 30, 2014

在防止sql注入这些细节出现问题的一般是那些大意的程序员或者是新手程序员,他们由于没有对用户提交过来的数据进行一些必要的过滤,从而导致了给大家测试的时候一下就攻破了你的数据库,下面我们来简单的介绍一个用户登录未进行安全配置可能出现的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语句,存在很大的安全隐患,如果使用以下万能密码和万能用户名,那么可以轻松进入页面:

$sql = 'select * from test where username = "***" and password = "***" or 1 = "1"';

很明显,针对这条sql语句的万能密码是: ***" or 1 = "1

$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过来变量 */
foreach ($_GET as $get_key=>$get_var)
{
if (is_numeric($get_var)) {
$get[strtolower($get_key)] = get_int($get_var);
} else {
$get[strtolower($get_key)] = get_str($get_var);
}
}
/* 过滤所有POST过来的变量 */
foreach ($_POST as $post_key=>$post_var)
{
if (is_numeric($post_var)) {
$post[strtolower($post_key)] = get_int($post_var);
} else {
$post[strtolower($post_key)] = get_str($post_var);
}
}
/* 过滤函数 */
//整型过滤函数
function get_int($number)
{
return intval($number);
}
//字符串型过滤函数
function get_str($string)
{
if (!get_magic_quotes_gpc()) {
return addslashes($string);
}
return $string;
}

另外还有一些博客会这样写

<?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 = nl2br($post); // 回车转换 
$post= htmlspecialchars($post); // html标记转换 
return $post; 
} 
?>
PHP 相关文章推荐
使用PHPMYADMIN操作mysql数据库添加新用户和数据库的方法
Apr 02 PHP
php+jquery编码方面的一些心得(utf-8 gb2312)
Oct 12 PHP
通达OA公共代码 php常用检测函数
Dec 14 PHP
php提示undefined index的几种解决方法
May 21 PHP
PHP判断文件是否存在、是否可读、目录是否存在的代码
Oct 03 PHP
基于Zookeeper的使用详解
May 02 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
Jul 22 PHP
图解找出PHP配置文件php.ini的路径的方法
Aug 20 PHP
php获取、检查类名、函数名、方法名的函数方法
Jun 25 PHP
FastCGI 进程意外退出造成500错误
Jul 26 PHP
Laravel中日期时间处理包Carbon的简单使用
Sep 21 PHP
基于ThinkPHP5框架使用QueryList爬取并存入mysql数据库操作示例
May 25 PHP
PHP获取时间排除周六、周日的两个方法
Jun 30 #PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十六)
Jun 30 #PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十五)
Jun 30 #PHP
解析PHP强制转换类型及远程管理插件的安全隐患
Jun 30 #PHP
PHP数字和字符串ID互转函数(类似优酷ID)
Jun 30 #PHP
PHP把数字转成人民币大写的函数分享
Jun 30 #PHP
PHP统计nginx访问日志中的搜索引擎抓取404链接页面路径
Jun 30 #PHP
You might like
用PHP即时捕捉PHP中的错误并发送email通知的实现代码
2013/01/19 PHP
详细解读php的命名空间(一)
2018/02/21 PHP
PHP+Ajax实现的检测用户名功能简单示例
2019/02/12 PHP
如何在Web页面上直接打开、编辑、创建Office文档
2007/03/12 Javascript
火狐浏览器(firefox)下获得Event对象以及keyCode
2008/11/13 Javascript
JavaScript 学习笔记 Black.Caffeine 09.11.28
2009/11/30 Javascript
jQuery中ajax的load()方法用法实例
2014/12/26 Javascript
微信小程序开发实战教程之手势解锁
2016/11/18 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
js实现图片放大展示效果
2017/08/30 Javascript
Vue中的Props(不可变状态)
2018/09/29 Javascript
微信小程序实现一个简单swiper代码实例
2019/12/30 Javascript
vue设置默认首页的操作
2020/08/12 Javascript
[03:20]2015国际邀请赛全明星表演赛
2015/08/08 DOTA
Python抓取手机号归属地信息示例代码
2016/11/28 Python
Python 十六进制整数与ASCii编码字符串相互转换方法
2018/07/09 Python
用python脚本24小时刷浏览器的访问量方法
2018/12/07 Python
Flask框架踩坑之ajax跨域请求实现
2019/02/22 Python
Python Pandas数据结构简单介绍
2019/07/03 Python
详解用Python为直方图绘制拟合曲线的两种方法
2019/08/21 Python
Django实现后台上传并显示图片功能
2020/05/29 Python
Python基于Twilio及腾讯云实现国际国内短信接口
2020/06/18 Python
Python定时任务APScheduler安装及使用解析
2020/08/07 Python
泰国第一在线超市:Tops
2021/02/13 全球购物
软件测试工程师面试问题精选
2016/10/28 面试题
职业规划书如何设计?
2014/01/09 职场文书
央视元宵晚会主持串词
2014/03/25 职场文书
家长会学生演讲稿
2014/04/26 职场文书
物联网工程专业推荐信
2014/09/08 职场文书
副校长个人对照检查材料思想汇报
2014/10/04 职场文书
2014五年级班主任工作总结
2014/12/05 职场文书
中学生学习保证书
2015/02/26 职场文书
任命书怎么写
2015/03/02 职场文书
运动会开幕式通讯稿
2015/07/18 职场文书
2015年公司中秋节致辞
2015/07/31 职场文书
Django使用redis配置缓存的方法
2021/06/01 Redis