Home > php教程 > php手册 > body text

PHP登录中的防止sql注入方法分析

WBOY
Release: 2016-05-25 16:41:38
Original
1186 people have browsed it

防止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('输入有误'); 
}
Copy after login

注意上面的sql语句,存在很大的安全隐患,如果使用以下万能密码和万能用户名,那么可以轻松进入页面,代码如下:

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

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

2. $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; 
}
Copy after login

还有一些博客会这样写,代码如下:

<?php    
function post_check($post)  
{  
    if (!get_magic_quotes_gpc()) // 判断magic_quotes_gpc是否为打开  
    {  
        $post = addslashes($post); // 进行magic_quotes_gpc没有打开的情况对提交数据的过滤  
    }  
    $post = str_replace("_", "\_", $post); // 把 &#39;_&#39;过滤掉  
    $post = str_replace("%", "\%", $post); // 把&#39; % &#39;过滤掉  
    $post = nl2br($post); // 回车转换  
    $post= htmlspecialchars($post); // html标记转换  
    return $post;  
}
Copy after login


文章网址:

随意转载^^但请附上教程地址。

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Recommendations
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!