在防止 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;
- }
- ?>
来源: https://www.php1.cn/detail/php-0c7b6d0b1c.html