PDO通过预处理语句防止sql注入

博客介绍简单登录页面防注入相关内容。先在数据库test中建表并插入数据,展示登入界面。先正常编写check.php页面,未做处理时输入注入语句可成功注入;后更换为预处理语句(占位符),再次输入注入语句则无法注入,实现防注入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单登录页面防注入

数据库:test;

建表
CREATE TABLE USER(
	id INT UNSIGNED AUTO_INCREMENT KEY,
	username VARCHAR(20) NOT NULL,
	password CHAR(32) NOT NULL,
	email CHAR(32) NOT NULL
);
向表中插入一条数据:
INSERT INTO user(username,password,email) VALUES('user','root','123@qq.com');
登入界面:
<!DOCTYPE html>
	<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>login</title>
</head>
<body>
	<form action="check.php" method="post" accept-charset="utf-8">
		用户名:<input type="text" name="username"><br>
		密 码:<input type="password" name="psw"><br>
		<input type="submit"value="提交"> 
	</form>
</body>
</html>
1.首先先正常编写check.php页面,不做任何处理。
header('content-type:text/html;charset=utf-8');
$username=$_POST['username'];
$psw=$_POST['psw'];
try {
	$pdo=new PDO('mysql:host=localhost;dbname=test','root','root');
	$sql="select * from user where username='{$username}' and password='{$psw}'";
	$stmt=$pdo->query($sql);//返回结果集中的行数echo 
	$stmt->rowCount();
} catch (Exception $e) {
	echo $e->getMessage();
}

执行操作
输入正确的用户名:user 密码:root
结果:1(因为查询到一条记录 通过echo rowCount()输出)
输入错误的用户名或密码
结果:0
输入注入语句
用户名:'or 1=1 # 密码:随便写 结果:1

2.更换为预处理语句(占位符)
第一种
header('content-type:text/html;charset=utf-8');
$username=$_POST['username'];
$psw=$_POST['psw']; 
try {
	$pdo=new PDO('mysql:host=localhost;dbname=test','root','root');  
	$sql="select * from user where username=:username and password=:psw";  
	$stmt=$pdo->prepare($sql);  
	$stmt->execute(array(":username"=>$username,":psw"=>$psw)); 
	echo $stmt->rowCount(); 
} catch (Exception $e) {  
	echo $e->getMessage();
}
第二种
header('content-type:text/html;charset=utf-8');
$username=$_POST['username'];
$psw=$_POST['psw']; 
try {  
	$pdo=new PDO('mysql:host=localhost;dbname=test','root','root');  
	$sql="select * from user where username=? and password=?";  
	$stmt=$pdo->prepare($sql);  
	$stmt->execute(array($username,$psw));  
	echo $stmt->rowCount(); 
} catch (Exception $e) {  
	echo $e->getMessage(); 
}

执行操作
输入注入语句
用户名:'or 1=1 #  密码:随便写      结果:0   说明已经无法注入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值