使用 MySQLi 时如何防止 SQL 注入? [复制]
Posted
技术标签:
【中文标题】使用 MySQLi 时如何防止 SQL 注入? [复制]【英文标题】:How can i prevent SQL injection when using MySQLi? [duplicate] 【发布时间】:2013-05-04 20:22:54 【问题描述】:在这样的 SQL 查询中如何防止 SQL 注入?
<?php
$mysqli = new mysqli("ip", "username", "pass", "database");
/* check connection */
if (mysqli_connect_errno())
printf("Sorry, the login server is 'Under Maintainance'");
exit();
$username = $_POST["username1"];
$username = strtolower($username);
$password = $_POST['password1'];
$hash = sha1(strtolower($username) . $password);
$query = "SELECT * FROM accounts WHERE name='$username'";
if ($result = $mysqli->query($query))
/* determine number of rows result set */
$rownum = $result->num_rows;
if($rownum != 0)
while ($row = $result->fetch_assoc())
$acct = $row['acct'];
$pass = $row['pass'];
if($hash == $pass)
session_start();
$_SESSION['name']=$username;
$_SESSION['acct']=$acct;
header('Location:index.php');
else
echo 'There was an error when logging in. Make sure your password and username are correct.';
$result->close();
else
echo 'Account does not exist. Please <a href="register.php">Register</a> an account before logging in.';
$mysqli->close();
?>
我已经添加了加密,但我似乎找不到我知道如何使用的预防方法。另外,用户是否可以在不使用输入框的情况下使用 MySQL 注入? (页面解剖???)
【问题讨论】:
防止黑客入侵是不可能的。您必须雇用人员来保护您的代码库,以防有人在您添加保护措施之前及时入侵它 hahahah 帖子是关于 sql 注入的,不像...缓冲区溢出和所有那些很酷的东西 【参考方案1】:加密和查询卫生无关。
您已经在使用mysqli
,这很好,但您没有清理查询的输入(即$username
,可能也不需要strtolower
ed)。
您应该使用正确的参数化查询来进行卫生处理。
$query = "SELECT * FROM accounts WHERE name = ?";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("s", $username);
$stmt->execute();
$stmt->bind_result($acct, $pass);
$stmt->fetch();
//$act and $pass are now properly set
SQL注入的限制与用户无关。你甚至有可能不小心将自己注入到自己的代码中,而且注入甚至不一定是恶意的。因此,即使您认为不存在任何恶意注入风险,您也应该始终正确地参数化您的查询。
【讨论】:
strtolower 只是我使用的东西,因此多个用户没有相同的用户名。例如:用户和用户R。 :)以上是关于使用 MySQLi 时如何防止 SQL 注入? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
防止 SQL 注入的 Htaccess 和 Mysqli 方法之间的区别
mysqli_real_escape_string 如何无法阻止 SQL 注入? [复制]