我保持简短,我试图将一些代码应用于我的插入查询以防止SQL注入。请参阅以下代码:
$insertquery = mysql_query("INSERT INTO users (firstname, lastname, email, username, password) VALUES ('".mysql_real_escape_string($fname)."', '".mysql_real_escape_string($lname)."', '".mysql_real_escape_string($email)."', '".mysql_real_escape_string($username)."', .'".mysql_real_escape_string($pass)."')");
header("location:index-login-page.php?msg1=Thank you for choosing SIAA, please login.");
上面的代码不会插入任何数据,但它仍会打印msg1消息。我做错了什么,或者甚至可以防止插入语句上的SQL注入。
谢谢
苏海尔。
答案 0 :(得分:3)
使用PDO和准备好的查询。使用预准备语句和参数化查询。这些是由数据库服务器与任何参数分开发送和解析的SQL语句。这样攻击者就无法注入恶意SQL。请看下面的例子。
($conn is a PDO object)
$conn = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("INSERT INTO users VALUES(:firstname, :lastname)");
$stmt->bindValue(':firstname', $firstname);
$stmt->bindValue(':lastname', $lastname);
$stmt->execute();
答案 1 :(得分:1)
使用预备语句,这将在任何情况下解决问题。这样,用户输入就会单独发送,无法篡改查询。
http://php.net/manual/de/mysqli.quickstart.prepared-statements.php