这段代码可防止SQL注入和其他类型的攻击吗? (如果是为什么?)

时间:2018-07-22 10:47:07

标签: php mysql

我想知道这段代码是否可以安全地进行SQL注入和其他类型的利用?如果安全的话,谁能向我解释呢?如果不是,那么任何人都可以进行纠正

<?php     
$servername = "localhost";       
$username = "root";    
 $password = "";    
 $dbname = "form";    

//Requesting values form form.html    
$a = $_REQUEST['fname'];    
$b = $_REQUEST['lname'];    
$c = $_REQUEST['email'];    

// Create connection    
 $conn = new mysqli($servername, $username, $password, $dbname);     
// Check connection     
if ($conn->connect_error) {    
    die("Connection failed: " .$conn->connect_error);    
 } 

// prepare and bind     
$stmt = $conn->prepare ("INSERT INTO my_db (fname, lname, email)    
  VALUES (?, ?, ?)");    
 $stmt->bind_param("sss",$a,$b,$c);    

$stmt->execute();    

echo "new record created successfully";    

$stmt->close();    
 $conn->close();     
?>   

1 个答案:

答案 0 :(得分:-2)

是的,从SQL Injection来看是安全的,但仍可以在安全性方面进行改进。

SQL注入是当您将sql查询与用户参数连接在一起时,这为恶意用户提供了在数据库中注入数据或执行危险操作的机会。

假设您有一个代码:

$query = 'select * from user where id = ' + $_GET['id'];

现在假设黑客将id参数发送为1或1 = 1,那么您的查询将变为

select * from user where id = 1 or 1 = 1

这将返回所有用户。还有其他注入方式

由于您正在使用准备好的语句并绑定所有参数,因此无法连接sql查询。

安全性

  • 您的代码接受$ _REQUEST,其中包括GET和POST。这不是一个好习惯。您应该将CRUD限制为仅POST。
  • 您正在使用root(即使在开发环境中也不应使用root)