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 相关文章推荐
支持oicq头像的留言簿(一)
Oct 09 PHP
将RTF格式的文件转成HTML并在网页中显示的代码
Oct 09 PHP
php 获取一个月第一天与最后一天的代码
May 16 PHP
php数组(array)输出的三种形式详解
Jun 05 PHP
解析php多线程下载远程多个文件
Jun 25 PHP
php中time()和mktime()方法的区别
Sep 28 PHP
mantis安装、配置和使用中的问题小结
Jul 14 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
Jun 10 PHP
php求今天、昨天、明天时间戳的简单实现方法
Jul 28 PHP
提高Laravel应用性能方法详解
Jun 24 PHP
浅谈laravel框架sql中groupBy之后排序的问题
Oct 17 PHP
php中pcntl_fork详解
Apr 01 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中ini_set与ini_get用法实例
2014/11/04 PHP
PHP环境搭建(php+Apache+mysql)
2016/11/14 PHP
laravel 创建命令行命令的图文教程
2019/10/23 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
2020/06/24 PHP
12款经典的白富美型—jquery图片轮播插件—前端开发必备
2013/01/08 Javascript
js弹出层包含flash 不能关闭隐藏的2种处理方法
2013/06/17 Javascript
推荐8款jQuery轻量级树形Tree插件
2014/11/12 Javascript
使用jspdf生成pdf报表
2015/07/03 Javascript
深入学习JavaScript的AngularJS框架中指令的使用方法
2016/03/05 Javascript
AngularJs  Creating Services详解及示例代码
2016/09/02 Javascript
JS手机端touch事件计算滑动距离的方法示例
2017/10/26 Javascript
五步轻松实现JavaScript HTML时钟效果
2020/03/25 Javascript
jQuery 防止相同的事件快速重复触发方法
2018/02/08 jQuery
AngularJS 多指令Scope问题的解决
2018/10/25 Javascript
微信小程序实现单选功能
2018/10/30 Javascript
vue开发拖拽进度条滑动组件
2019/09/21 Javascript
Vue Router的手写实现方法实现
2020/03/02 Javascript
Python bsddb模块操作Berkeley DB数据库介绍
2015/04/08 Python
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
2017/06/15 Python
解决django FileFIELD的编码问题
2020/03/30 Python
Python网络爬虫四大选择器用法原理总结
2020/06/01 Python
浅析Python中字符串的intern机制
2020/10/03 Python
python实现图片,视频人脸识别(dlib版)
2020/11/18 Python
利于python脚本编写可视化nmap和masscan的方法
2020/12/29 Python
HTML5操作WebSQL数据库的实例代码
2017/08/26 HTML / CSS
如何查看浏览器对html5的支持情况
2020/12/15 HTML / CSS
美国折扣网站:jClub
2017/08/07 全球购物
学生出入校管理制度
2014/01/16 职场文书
40岁生日感言
2014/02/15 职场文书
优秀的导游求职信范文
2014/04/06 职场文书
我的中国梦演讲稿小学篇
2014/08/19 职场文书
2014年“四风”问题个人整改措施
2014/09/17 职场文书
涉外离婚协议书怎么写
2014/11/20 职场文书
2015年安全工作总结范文
2015/04/02 职场文书
婚礼领导致辞大全
2015/07/28 职场文书
Nginx代理Redis哨兵主从配置的实现
2022/07/15 Servers