PHP - 防止插入语句上的SQL注入

问题描述:

我会保持这个简短,我试图将一些代码应用到我的插入查询以防止SQL注入。请参阅下面的代码:PHP - 防止插入语句上的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注入。

谢谢你

苏海尔。

+5

存在SOF的热门问题。 http://*.com/questions/60174/how-can-i-prevent-sql-injection-in-php –

+0

基本调试:在执行之前回显您的查询。显示什么? – Jocelyn

使用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(); 
+0

您好Ninju,您已经放置($ conn是一个PDO对象) - 我收到一个错误,说意外的'是'..这是为什么? –

+0

我编辑了我的答案。使用PDO访问MySQL数据库默认情况下不使用实际准备的语句。 – Ninju

+0

但是如果我在我的php文件上面写了'include(“dbconfig.php”)'会怎么样? –

使用准备好的语句,这将在任何情况下解决问题。通过这种方式,用户输入被孤立地发送并且无法篡改查询。

http://php.net/manual/de/mysqli.quickstart.prepared-statements.php

或者How can I prevent SQL injection in PHP?