php与数据库交互

4 阅读1分钟

php与数据库交互

万能密码的本质是篡改SQL查询逻辑,让WHERE条件恒成⽴,绕过密码验证

登录

请求GET,_GET,_POST

后端查询比对

<?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());
}
if($_POST){
//第⼆步:接收⽤户输⼊(登录⻚的账号密码)
$name=$_POST['name'];//POST⽅式:密码不暴露在URL,更安全
$pwd=$_POST['password'];
//第三步:执⾏SQL查询(漏洞根源)
$sql="SELECT*FROMusersWHEREname='$name'ANDpassword='$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);
?>
<!DOCTYPEhtml>
<htmllang="en">
<head>
<metacharset="UTF-8">
<metaname="viewport"content="width=device-width,initial-scale=1.0">
<title>教务系统登录</title>
</head>
<body>
<formmethod="post">
⽤户名:<inputtype="text"name="name"><br><br>
密&nbsp;&nbsp;码:<inputtype="password"name="password"><br><br>
<buttontype="submit">登录</button>
</form>
</body>
</html>

原正常SQL:SELECT * FROM users WHERE name='admin' AND password='123'

篡改后SQL:SELECT * FROM users WHERE name='admin' AND password='123'or '1'='1'

防御策略,后端过滤特殊字符(' " - or)

问题代码

sql="SELECTFROMusersWHEREid=sql="SELECT FROM users WHERE id = id";

?id=-1 union select 1,2,3,4,5,6 -- -

库information_schema

表schemata 表tables

table_nametable_schemacolumns
表名库名字段名