sql注入基本原理

<?php
// 数据库连接配置
$db_host = '127.0.0.1';  // 数据库服务器地址
$db_user = 'root';       // 数据库用户名
$db_pass = 'root';       // 数据库密码
$db_name = 'school';     // 数据库名称

// 建立数据库连接
$conn = mysqli_connect($db_host, $db_user, $db_pass, $db_name);

// 检查连接是否成功
if (!$conn) {
  die("数据库连接失败: " . mysqli_connect_error());  // 连接失败时终止并显示错误
}

// 检查是否有POST请求提交
if($_POST){
  // 获取表单提交的用户名和密码
  $name = $_POST['name'];
  $pwd = $_POST['password'];
  
  // 构造SQL查询语句(存在SQL注入风险)
  $sql = "SELECT * FROM users WHERE name='$name' AND password='$pwd'";
  
  // 执行查询
  $result = mysqli_query($conn, $sql);
  
  // 检查查询结果是否有匹配记录
  if (mysqli_num_rows($result) > 0) {
    // 获取用户信息关联数组
    $user_info = mysqli_fetch_assoc($result);
    
    // 输出登录成功信息及用户敏感信息(存在安全隐患)
    echo "登录成功!欢迎你:" . $user_info['name']."你的身份证号是:".$user_info['id_card']."你的手机号是:".$user_info['phone'];
  } else {
    echo "登录失败:用户名或密码错误";  // 无匹配记录时提示错误
  }
}

// 关闭数据库连接
mysqli_close($conn);
?>
 

<!DOCTYPE html>
<html lang="en">
<head>
  <!-- 基本页面元信息 -->
  <meta charset="UTF-8">  <!-- 字符编码 -->
  <meta name="viewport" content="width=device-width, initial-scale=1.0">  <!-- 响应式设计 -->
  <title>Document</title>  <!-- 页面标题 -->
</head>
<body>
  <!-- 登录表单 -->
  <form method="post">  <!-- 使用POST方法提交 -->
    用户名:<input type="text" name="name"><br><br>  <!-- 用户名输入框 -->
    密  码:<input type="password" name="password"><br><br>  <!-- 密码输入框 -->
    <button type="submit">登录</button>  <!-- 提交按钮 -->
  </form>
</body>
</html>
 

这两段代码就是用户登录时,验证用户密码是否与数据库里的数据是否一致的作用。

当用户在前端输入自己的账户和密码时,会用全局变量$_POST接收这组数据:

$_POST{

                 [name] = "xixi"

                 [password] = "123"            }

这组数据可以交给后端去验证,后端是没有数据库的,这时可以通过$conn = mysqli_connect('127.0.0.1','root','root','school')去让php与数据库建立链接。

然后通过if语句来检验$_POST['name']和$_POST['password']这两个字符串。并把他们分别赋值给$name和$pwd

其中sql语句

select * from school.user where name=`$name` AND password=`$pwd`;

这只能看数据库里有没有这一组数据,是无法验证其是不是我的用户,还得通过if语句继续判断这一句sql语句,返回的表单是否不为空就行了。

但是这一sql语句是有漏洞的,比如用户$_POST['password']里输入的是

` or `1`=`1

那么它就会变成这一sql语句:

select * from school.user where name=`$name` AND password=`` or `1`=`1`;

这样的话就会让and失效,去执行or后面的`1`=`1`。显然1=1是真那么数据库会把所有用户返回给php,即mysqli_num_rows($result)肯定大于0,也就是用户随便输入就能登录进去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值