$flag = false; if (isset($_POST["submit"])) { $username = $_POST["username"]; $password = $_POST["password"]; $query = "SELECT * FROM users WHERE username='".$username."' AND password='".$password."'"; $result = mysqli_query($conn, $query); if (mysqli_num_rows($result) >0) { $flag = true; } } if($flag == true) { echo "Welcome ".$username."!"; } else { echo "Invalid Login Information!"; }
由于这段代码在构造查询时没有对用户输入进行过滤,可以轻松地受到SQL注入攻击。例如,攻击者可以在用户名或密码字段中注入恶意SQL代码,并使用内置函数拿到shell。
SELECT * FROM users WHERE username='admin' AND password='' or 1 = 1; SHOW TABLES;#
为了防止MySQL注入攻击,需要使用参数化查询或使用转义函数对用户输入进行净化。例如,可以使用MySQL的mysqli_real_escape_string()函数来转义用户输入。
$username = mysqli_real_escape_string($conn, $_POST["username"]); $password = mysqli_real_escape_string($conn, $_POST["password"]); $query = "SELECT * FROM users WHERE username='".$username."' AND password='".$password."'";
除了转义用户输入之外,还可以使用参数化查询来预编译SQL语句。例如,以下代码使用mysqli_stmt_bind_param()函数将用户输入绑定到查询中。
$stmt = mysqli_prepare($conn, "SELECT * FROM users WHERE username=? AND password=?"); mysqli_stmt_bind_param($stmt, "ss", $username, $password); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt);
在客户端编写对用户输入的验证也是一种防御注入攻击的方法。例如,验证用户输入仅包含预期的字符集,设置输入长度限制,以及在提交时清除不安全的字符。
总的来说,预防MySQL注入攻击需要从多个方面进行。正确验证和转义用户输入可以帮助防御攻击,使用参数化查询可以进一步加强安全性。