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 相关文章推荐
提高php运行速度的一些小技巧分享
Jul 03 PHP
php通过rmdir删除目录的简单用法
Mar 18 PHP
PHP+AJAX实现投票功能的方法
Sep 28 PHP
PHP的Yii框架的常用日志操作总结
Dec 08 PHP
Symfony2中被遗弃的getRequest()方法分析
Mar 17 PHP
php生成Android客户端扫描可登录的二维码
May 13 PHP
Yii2中添加全局函数的方法分析
May 04 PHP
Yii2.0 RESTful API 基础配置教程详解
Dec 26 PHP
PHP基于GD2函数库实现验证码功能示例
Jan 27 PHP
YII框架实现自定义第三方扩展操作示例
Apr 26 PHP
laravel高级的Join语法详解以及使用Join多个条件
Oct 16 PHP
tp5框架使用cookie加密算法实现登录功能示例
Feb 10 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解密算法
2020/09/13 PHP
Yii2框架使用计划任务的方法
2016/05/25 PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
2016/11/14 PHP
php二维码生成以及下载实现
2017/09/28 PHP
JavaScript取得鼠标绝对位置程序代码介绍
2012/09/16 Javascript
让AJAX不依赖后端接口实现方案
2012/12/03 Javascript
javascript中RegExp保留小数点后几位数的方法分享
2013/08/13 Javascript
javascript中普通函数的使用介绍
2013/12/19 Javascript
基于JavaScript如何制作遮罩层对话框
2016/01/26 Javascript
jQuery Mobile中的button按钮组件基础使用教程
2016/05/23 Javascript
socket.io学习教程之基本应用(二)
2017/04/29 Javascript
VUE中使用Vue-resource完成交互
2017/07/21 Javascript
Vue-Access-Control 前端用户权限控制解决方案
2017/12/01 Javascript
jQuery实现的点击按钮改变样式功能示例
2018/07/21 jQuery
vue单页应用在页面刷新时保留状态数据的方法
2018/09/21 Javascript
解决vue-cli webpack打包后加载资源的路径问题
2018/09/25 Javascript
详解Vue源码学习之双向绑定
2019/04/10 Javascript
vue实现员工信息录入功能
2020/06/11 Javascript
[03:52]显微镜下的DOTA2第三期——英雄在无聊的时候干什么
2014/06/20 DOTA
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
详解Python之unittest单元测试代码
2018/01/24 Python
Python使用pyautogui模块实现自动化鼠标和键盘操作示例
2018/09/04 Python
python 分离文件名和路径以及分离文件名和后缀的方法
2018/10/21 Python
复古斯堪的纳维亚儿童服装:Baby go Retro
2017/09/09 全球购物
百思买加拿大:Best Buy Canada
2018/03/20 全球购物
获取邓白氏信用报告:Dun & Bradstreet
2019/01/22 全球购物
社会工作专业求职信
2014/07/15 职场文书
运动会广播稿200米(5篇)
2014/10/15 职场文书
幼儿园中班个人总结
2015/02/28 职场文书
2015年工程部工作总结
2015/04/30 职场文书
圆明园纪录片观后感
2015/06/03 职场文书
钢琴师观后感
2015/06/12 职场文书
小学英语教学随笔
2015/08/14 职场文书
民事调解协议书
2016/03/21 职场文书
python之基数排序的实现
2021/07/26 Python
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
2022/01/22 MySQL