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循环获取GET和POST值的代码
Apr 09 PHP
php session 错误
May 21 PHP
PHP UTF8编码内的繁简转换类
Jul 20 PHP
php 目录与文件处理-郑阿奇(续)
Jul 04 PHP
php的declare控制符和ticks教程(附示例)
Mar 21 PHP
destoon网站转移服务器后搜索汉字出现乱码的解决方法
Jun 21 PHP
简单介绍PHP非阻塞模式
Mar 03 PHP
PHP获取指定时间段之间的 年,月,天,时,分,秒
Jun 05 PHP
php计算多个集合的笛卡尔积实例详解
Feb 16 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
Feb 08 PHP
php 截取中英文混合字符串的方法
May 31 PHP
PHP遍历数组的6种方式总结
Nov 17 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源码之explode使用说明
2011/08/05 PHP
php数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
php模拟post行为代码总结(POST方式不是绝对安全)
2012/02/22 PHP
PHP中time(),date(),mktime()区别介绍
2013/09/28 PHP
解决ThinkPHP下使用上传插件Uploadify浏览器firefox报302错误的方法
2015/12/18 PHP
Yii2设置默认控制器的两种方法
2017/05/19 PHP
PHP编程实现的TCP服务端和客户端功能示例
2018/04/13 PHP
laravel5.6中的外键约束示例
2019/10/23 PHP
php中yar框架实例用法讲解
2020/12/27 PHP
Jquery仿IGoogle实现可拖动窗口示例代码
2014/08/22 Javascript
JavaScript移除数组内重复元素的方法
2015/03/18 Javascript
js正则表达式中exec用法实例
2015/07/23 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(下)
2015/10/28 Javascript
CSS3 media queries结合jQuery实现响应式导航
2016/09/30 Javascript
js倒计时显示实例
2016/12/11 Javascript
简单的jQuery拖拽排序效果的实现(增强动态)
2017/02/09 Javascript
详解一个基于套接字实现长连接的express
2019/03/28 Javascript
vue项目添加多页面配置的步骤详解
2019/05/22 Javascript
js实现特别简单的钟表效果
2020/09/14 Javascript
[51:44]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第二场
2018/04/04 DOTA
Python捕捉和模拟鼠标事件的方法
2015/06/03 Python
Python对list列表结构中的值进行去重的方法总结
2016/05/07 Python
python2 与python3的print区别小结
2018/01/16 Python
Python遍历某目录下的所有文件夹与文件路径
2018/03/15 Python
Flask 让jsonify返回的json串支持中文显示的方法
2018/03/26 Python
python利用requests库进行接口测试的方法详解
2018/07/06 Python
pandas 空的dataframe 插入列名的示例
2018/10/30 Python
将Python字符串生成PDF的实例代码详解
2019/05/17 Python
解决keras模型保存h5文件提示无此目录问题
2020/07/01 Python
德能勤绩工作总结
2015/08/11 职场文书
聘任通知书
2015/09/21 职场文书
《秦兵马俑》教学反思
2016/02/24 职场文书
乡镇团代会开幕词
2016/03/04 职场文书
Python基础之常用库常用方法整理
2021/04/30 Python
Pytorch中的数据集划分&正则化方法
2021/05/27 Python
MySQL的意向共享锁、意向排它锁和死锁
2022/07/15 MySQL