防止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语句,存在很大的安全隐患,如果使用以下万能密码和万能用户名,那么可以轻松进入页面,代码如下:
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注册函数,代码如下:
-
- 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);
- }
- }
-
- 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())
- {
- $post = addslashes($post);
- }
- $post = str_replace("_", "\_", $post);
- $post = str_replace("%", "\%", $post);
- $post = nl2br($post);
- $post= htmlspecialchars($post);
- return $post;
- }
- ?>
|