我是PHP新手,希望有人能帮助我解决这个问题。PHP/MySQLi:如何防止INSERT上的SQL注入(代码部分工作)
我想使用PHP在MySQL数据库中存储两个值(电子邮件和密码)。输入通过jQuery中的Ajax传递给PHP页面(通过网站上的onclick事件)。
现在我想保护这个PHP查询免受SQL注入攻击 - 我正在谈论一个标准的网站,所以我不想过头,但我认为一些标准的保护措施不能坏。
以下是我之前所做的工作,只是为了确保一般程序正在运行。 然后我试图通过使用密码加密和陈述来提高安全性,但我不确定是否以正确的方式做了这个+我不知道是否以及如何将这个需要应用到选择部分(以及我正在检查电子邮件是否已经存在)。
我已经看过很多关于这个主题的网页,但作为一个初学者,这正是我的问题。 有人可以用这个例子来说明什么应该改变或在这里添加,也许提供一些简短的解释?如果可能,我想继续使用MySQLi。
以前的PHP:
$conn = new mysqli($servername, $username, $password, $dbname);
$conn->set_charset("utf8");
if($conn->connect_error){
die("Connection failed: " . $conn->connect_error);
}
$email = $_POST["email"];
$pw = $_POST["pw"];
$sql = "SELECT email FROM Users WHERE email = '" . $email . "'";
$query = $conn->query($sql);
if(mysqli_num_rows($query) > 0){
echo "Record already exists";
}else{
$sql = "INSERT INTO Users (email, pw) VALUES ('" . $email . "', '" . $pw . "')";
if($conn->query($sql)){
echo "Update successful";
}else{
echo "Update failed";
};
}
$conn->close();
新PHP:
$conn = new mysqli($servername, $username, $password, $dbname);
$conn->set_charset("utf8");
if($conn->connect_error){
die("Connection failed: " . $conn->connect_error);
}
$email = $_POST["email"];
$pw = password_hash($_POST["pw"], PASSWORD_BCRYPT);
$sql = "SELECT email FROM Users WHERE email = '" . $email . "'";
$query = $conn->query($sql);
if(mysqli_num_rows($query) > 0){
echo "Record already exists";
}else{
$sql = $conn->prepare("INSERT INTO Users (email, pw) VALUES ('" . $email . "', '" . $pw . "')");
$sql->bind_param('s', $name);
$sql->execute();
$result = $sql->get_result();
if($result){
echo "Update successful";
}else{
echo "Update failed";
};
}
$conn->close();
更新:
从吉特伟大的答案和其他评论在这里后,我修改了我查询如下 - 有人可以让我知道,如果没有根据吉特的建议,现在是正确的吗?
$conn = new mysqli($servername, $username, $password, $dbname);
$conn->set_charset("utf8");
if($conn->connect_error){
die("Connection failed: " . $conn->connect_error);
}
$email = $_POST["email"];
$pw = password_hash($_POST["pw"], PASSWORD_BCRYPT);
$stmt = $conn->prepare("SELECT email FROM Users WHERE email = ?");
$stmt->bind_param('s', $email);
$stmt->execute();
$result = $stmt->get_result();
if(mysqli_num_rows($result) > 0){
echo "Record already exists";
}else{
$stmt = $conn->prepare("INSERT INTO Users (email, pw) VALUES (?, ?)");
$stmt->bind_param('ss', $email, $pw);
$stmt->execute();
$result = $stmt->get_result();
if($result){
echo "Update successful";
}else{
echo "Update failed";
};
}
$conn->close();
提前许多感谢, 麦克
查看准备好的语句:MySQLI http://php.net/manual/en/mysqli.prepare.php/PDO http://php.net/manual/en/pdo.prepared-statements.php – RuubW
谢谢你 - 我会看看。 – keewee279
可能的重复[如何防止SQL注入在PHP?](http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php) –