写一个简单的登陆系统
前端代码
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8">
</head>
<body>
<h2>登录页面</h2>
<form action="doLogin.php" method="post">
username:<input type="text" name="username" id=""/><br/>
password:<input type="password" name="password" id=""><br/>
<input type="submit" value="登录" ="">
</form>
</body>
</html>>
后台提交至
doLogin.php
<?php
header('content-type:text/html;charset=utf-8');
$mysqli=new mysqli('localhost','root','','test');
if($mysqli->errno)
{
die('Connect Error'.$mysqli->error);
}
$mysqli->set_charset('utf8');
$username=$_POST['username'];
$password=$_POST['password'];
// $sql="SELECT * FROM user WHERE username='{$username}' AND password='{$password}'";
// $mysqli_result=$mysqli->query($sql);
// if($mysqli_result&&$mysqli_result->num_rows>0)
// {
// //$row=$mysqli_result->fetch_assoc();
// echo '登录成功1';
// }
// else
// {
// echo '登录失败0';
// }
//为防止sql注入 比如在username里面写 'or 1=1# 这时候 也会显示登录成功
//1.对所输入进行过滤 2.使用预处理语句就不会出现这样的问题
$sql="SELECT * FROM user WHERE username=? AND password=?";
$mysqli_stmt=$mysqli->prepare($sql);
$mysqli_stmt->bind_param('ss',$username,$password);
if($mysqli_stmt->execute())
{
$mysqli_stmt->store_result();
if($mysqli_stmt->num_rows>0)
{
echo '登录成功';
}
else
{
echo '登录失败';
}
}
注释的部分即没有利用sql预处理 这样在登陆的username 里面写
'or 1=1# 这时候 也会显示登录成功
'or 1=1# 这时候 也会显示登录成功
这是一个非常可怕的问题
所以这时候需要利用预处理 或者 过滤来解决这个问题