美文网首页
php层防止sql注入的方法

php层防止sql注入的方法

作者: 小伟_be27 | 来源:发表于2019-11-26 17:56 被阅读0次

Talk is cheap,show me the code.
问题代码:

<?php
$servername="127.0.0.1";
$dbuser="muke_user";
$dbpassword="9Gcag71Gaa";
$dbname="muke";

$mysqli = new mysqli($servername,$dbuser,$dbpassword,$dbname); //配置MySQL连接

if($mysqli->connect_error){
        die('connect error:'.$mysqli->connect_errno);
}
$mysqli->set_charset('UTF-8'); // 设置数据库字符集
$username = isset($_GET['username']) ? $_GET['username'] : '';
$password = isset($_GET['password']) ? $_GET['password'] : '';
$sql = "select * from t24 where username='$username' and password= '$password'";
echo "$sql<br/>";
$result = $mysqli->query("$sql");

$data = $result->fetch_all(); // 从结果集中获取所有数据
if (empty($data))
{
        echo "登录失败";
} else {
        echo "登录成功";
}
echo "<br/>";
print_r($data);
?>

sql注入攻击:
http://localhost/index.php?username=tmd' or '1=1
sql语句变为:
select * from d_table where username = 'tmd' or '1=1' and password=''
登录成功!

解决方案:

1.参数的过滤

<?php
$servername="127.0.0.1";
$dbuser="muke_user";
$dbpassword="9Gcag71Gaa";
$dbname="muke";

$mysqli = new mysqli($servername,$dbuser,$dbpassword,$dbname); //配置MySQL连接

if($mysqli->connect_error){
        die('connect error:'.$mysqli->connect_errno);
}
$mysqli->set_charset('UTF-8'); // 设置数据库字符集
$username = isset($_GET['username']) ? $_GET['username'] : '';
$password = isset($_GET['password']) ? $_GET['password'] : '';

//增加对输入用户名密码的判断,如果不是字母或者数字,就直接提示格式错误而退出。
if( !preg_match("/^[a-zA-Z0-9]{1,}$/",$username) || !preg_match("/^[a-zA-Z0-9]{1,}$/",$password) ) {
        die("You input username and password  format error ");
}

$sql = "select * from t24 where username='$username' and password= '$password'";
echo "$sql<br/>";
$result = $mysqli->query("$sql");

$data = $result->fetch_all(); // 从结果集中获取所有数据
if (empty($data))
{
        echo "登录失败";
} else {
        echo "登录成功";
}
echo "<br/>";
print_r($data);
?>

对用户输入的用户名和密码,进行了正则的匹配,不符合规则的终止程序执行,参数校验不要忘记!

  1. addslashes()函数转义特殊字符
$sql = "select * from t24 where username='" . addslashes($username) . "' and password= '" . addslashes($password) . "'";

再次攻击:
http://localhost/index.php?username=tmd' or '1=1
sql语句变为:
select * from d_table where username = 'tmd\'or\'1=1' and password=''
登录失败!

相关文章

  • php层防止sql注入的方法

    Talk is cheap,show me the code.问题代码: sql注入攻击:http://local...

  • 如何做一些安全性

    关于PHP: 1、防sql注入,防止xss攻击 2、关掉危险函数,如eval等函数 3、代码层主要权限需要保护好,...

  • 【PHP】PHP内置过滤函数总结

    【PHP】PHP内置过滤函数总结 0x01 防止SQL注入 addslashes() 将 单引号(') 双引号("...

  • php中防止sql注入的方法

    一、在服务器端配置 安全,PHP代码编写是一方面,PHP的配置更是非常关键。 我们php手手工安装的,php的默认...

  • PHP中防止SQL注入的方法

    【一、在服务器端配置】 我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/co...

  • idea搭建 mybatis框架

    {}方式能够很大程度防止sql注入,${}方式无法防止Sql注入。 SELECT deptno,dname,loc...

  • php 中防止sql注入

    转载【小马哥】:https://www.cnblogs.com/mafeng/p/5939329.html 【一、...

  • TP5框架 《防sql注入、防xss攻击》

    TP框架中有自带的防止xss(跨站脚步攻击)、sql注入,在 application/config.php 中有个...

  • php面试题

    防止SQL注入简单回答:防止——利用即有的应用、功能,将(恶意)SQL命令发送到到后台数据库引擎。 防止SQL注入...

  • PHP代码安全之SQL注入

    PHP代码安全之SQL注入 1、什么是SQL注入? SQL攻击(英语:SQL injection),简称注入攻击,...

网友评论

      本文标题:php层防止sql注入的方法

      本文链接:https://www.haomeiwen.com/subject/zojywctx.html