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 生成文字png图片的代码
Apr 17 PHP
Array of country list in PHP with Zend Framework
Oct 17 PHP
php-cli简介(不会Shell语言一样用Shell)
Jun 03 PHP
php unset全局变量运用问题的深入解析
Jun 17 PHP
PHP引用符&amp;的用法详细解析
Aug 22 PHP
ThinkPHP实现将SESSION存入MYSQL的方法
Jul 22 PHP
php中get_object_vars()方法用法实例
Feb 08 PHP
PHP实现C#山寨ArrayList的方法
Jul 16 PHP
php表单处理操作
Nov 16 PHP
PHP使用Redis长连接的方法详解
Feb 12 PHP
PHP实现打包zip并下载功能
Jun 12 PHP
PHP-FPM和Nginx的通信机制详解
Feb 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
解决文件名解压后乱码的问题 将文件名进行转码的代码
2012/01/10 PHP
php使用cookie保存用户登录的用户名实例
2015/01/26 PHP
Thinkphp极验滑动验证码实现步骤解析
2020/11/24 PHP
Prototype Hash对象 学习
2009/07/19 Javascript
Extjs学习过程中新手容易碰到的低级错误积累
2010/02/11 Javascript
jquery validate在ie8下的bug解决方法
2013/11/13 Javascript
jquery使用淘宝接口跨域查询手机号码归属地实例
2013/11/28 Javascript
jquery ajax jsonp跨域调用实例代码
2013/12/11 Javascript
基于html5和nodejs相结合实现websocket即使通讯
2015/11/19 NodeJs
AngularJS 最常用的功能汇总
2016/02/17 Javascript
js操作二进制数据方法
2018/03/03 Javascript
JS中通过url动态获取图片大小的方法小结(两种方法)
2018/10/31 Javascript
在vue使用clipboard.js进行一键复制文本的实现示例
2019/01/15 Javascript
JS实现盒子跟着鼠标移动及键盘方向键控制盒子移动效果示例
2019/01/29 Javascript
vue axios post发送复杂对象问题
2019/06/04 Javascript
微信接入之获取用户头像的方法步骤
2019/09/23 Javascript
python使用邻接矩阵构造图代码示例
2017/11/10 Python
python3获取两个日期之间所有日期,以及比较大小的实例
2018/04/08 Python
python模拟表单提交登录图书馆
2018/04/27 Python
Python提取特定时间段内数据的方法实例
2019/04/01 Python
python 实现一个反向单位矩阵示例
2019/11/29 Python
详解CSS3弹性伸缩盒
2020/09/21 HTML / CSS
日本最大化妆品和美容产品的综合口碑网站:cosme shopping
2019/08/28 全球购物
PPP协议组成及简述协议协商的基本过程
2015/05/28 面试题
JAVA程序设计笔试题面试题一套
2015/07/28 面试题
大学生个人自荐信
2014/02/24 职场文书
我的大学四年规划书范文2014
2014/09/26 职场文书
公安机关纪律作风整顿剖析
2014/10/10 职场文书
党员评议个人总结
2014/10/20 职场文书
新员工考核评语
2014/12/31 职场文书
同事打架检讨书
2015/05/06 职场文书
起诉书范文
2015/05/20 职场文书
家长对学校的意见和建议
2015/06/03 职场文书
开学季:喜迎新生,迎新标语少不了
2019/11/07 职场文书
SpringBoot系列之MongoDB Aggregations用法详解
2022/02/12 MongoDB
Redis配置外网可访问(redis远程连接不上)的方法
2022/12/24 Redis