2016-11-13 77 views
1

我在我的网站上有一个查询,最近因为它而被黑了。将查询转换为参数化查询

我花了2个小时看看如何转换这个查询,所以它是安全的,没有任何地方。

如果有人不介意,可否请将这一个转换为我,这样我就可以看到剩下的怎么办?

$camera_id = $_GET['camera_id']; 

$cameras = mysqli_query($conn, "SELECT * FROM cameras WHERE id = $camera_id"); 
$camera = mysqli_fetch_array($cameras); 
+1

调查使用PDO和使用绑定参数,而不是$ _GET查询 – gavgrif

+0

我会的ID。通常会减少这些类型的广泛问题,但由于您正在努力学习正确的方法,因此我认为我会回答 – e4c5

+0

mysqli和pdo准备好的语句中的手册包含有关其用法和语法的清晰示例。您应该发布您尝试的内容。 –

回答

1

尝试类似这样的事情。

$camera_id = $_GET['camera_id']; 

$cameras = mysqli_prepare($conn, "SELECT * FROM cameras WHERE id = ?"); 
mysqli_stmt_bind_param($cameras, $camera_id); 
$cameras->execute(); 

在制作开关时,直接切换到PDO。这是远高于或mysqli的

$db = new PDO('mysql:host=localhost;dbname=mydb', 'username', 'password'); 
    $stmt = $db->prepare("SELECT * FROM cameras WHERE id = :camera_id"); 
    $stmt->execute(array(":camera_id"=>$camera_id)); 
    $result = $stmt->fetchAll(); 

,而不是使用fetchall()

while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
    echo $row['field1'].' '.$row['field2']; //etc... 
} 

更好,因为你可以看到这是更具可读性。如果你稍后决定eto切换到postgresql,那么这个改变是很容易的。

+0

你好,非常感谢你很多为您的答复,我首先尝试了第一个,并得到这个错误:致命错误:调用未定义的函数mysqli_bind_param()在category_page.php第12行 – Bradley

+0

对不起@ e4c5 - 错误的字母.....双引号.... :) – gavgrif

+0

谢谢,我已经添加了这个,它现在可以工作,我只是得到这个错误: – Bradley

1

这是使用PDO,并假设相机ID是一个数字(如果它可以包含非数值交换PARAM_STR的PARAM_STR。基本前提是,您将查询从变量中分离出来,并将值还需要注意的是,你需要修改新的PDO声明中的变量以适应你自己的数据库,同样需要注意的是fetchAll()提供了返回结果的关联数组 - 还有一些其他的取()可能的方法来给出不同的结果 - 认准官方文档

$camera_id = $_GET['camera_id']; 

$conn = new PDO('mysql:host=localhost;dbname=db', 'username', 'password'); 

$sql = "SELECT * from cameras where id = :cameraId"; 
$q = $conn->prepare($sql); 
$q -> bindValue(":cameraId" , $camera_id, PDO::PARAM_INT); 
$q->execute(); 
$cameraRows = $q->fetchAll(); 
    foreach($cameraRows as $cameraRow){ 
    $CID= $cameraRow["camera_id"]; 
    //.... rest of the code 
    }