用PHP保护$ _GET请求

时间:2018-05-18 08:04:49

标签: php security get sql-injection

确保GET请求的最佳方式是什么?或者有更安全的替代方案吗?

我在我的网站上使用了几个GET请求来动态生成网页并根据ID删除记录。

最后一个让我担心,因为人们可以将URL更改为他们想要删除的文件。

要访问删除文件,他们需要登录并具有某些权限,如果他们没有足够的权限,则会产生错误。

我遇到了a really old SO post,声明您应该使用mysqli_real_escape_string功能使其至少更多安全。

我还读到关于验证真的很重要,所以我在考虑检查ID是否是实际的整数。

There's another post声明将请求隐藏在URL中基本上是无用的,因为请求将始终是URL的一部分。

这是我的删除文件,它使用两个语句,一个删除实际帖子,另一个删除带有该帖子的关联图像。

include('./utils/auth.php');

require('./utils/db.php');

$stmt_1 = $connect->prepare('DELETE FROM `dias` WHERE diaserie_id = ?');

if($stmt_1) {
    $id = $_GET['id'];
    $stmt_1->bind_param('i', $id);
    if($stmt_1->execute()) {
        // Als de afbeeldingen uit de database zijn, verwijder dan ook de serie zelf
        $stmt_2 = $connect->prepare('DELETE FROM `diaseries` WHERE diaserie_id = ?');
        if($stmt_2) {
            $stmt_2->bind_param('i', $id);
            if($stmt_2->execute()) {
                echo "Both the files and post have been deleted.";
            } else {
                echo "The files have been deleted, the post iself could not be deleted.";
            }
        }
    } else {
        echo "Files and post could not be deleted.";
    }
}

2 个答案:

答案 0 :(得分:1)

将图像和相关文件存储在数据库(MySQL)中,并且只允许从与相同登录凭据相关的数据库中删除。

您不应该考虑将图像上传到数据库,而是可以将上传文件的名称存储在数据库中,然后检索文件名并将其用于想要显示图像的位置。

HTML CODE:

<input type="file" name="imageUpload" id="imageUpload">

PHP代码:

if(isset($_POST['submit'])) {

    //Process the image that is uploaded by the user

    $target_dir = "uploads/";
    $target_file = $target_dir . basename($_FILES["imageUpload"]["name"]);
    $uploadOk = 1;
    $imageFileType = pathinfo($target_file,PATHINFO_EXTENSION);

    if (move_uploaded_file($_FILES["imageUpload"]["tmp_name"], $target_file)) {
        echo "The file ". basename( $_FILES["imageUpload"]["name"]). " has been uploaded.";
    } else {
        echo "Sorry, there was an error uploading your file.";
    }

    $image=basename( $_FILES["imageUpload"]["name"],".jpg"); // used to store the filename in a variable

    //storind the data in your database
    $query= "INSERT INTO items VALUES ('$id','$title','$description','$price','$value','$contact','$image')";
    mysql_query($query);

    require('heading.php');
    echo "Your add has been submited, you will be redirected to your account page in 3 seconds....";
    header( "Refresh:3; url=account.php", true, 303);
}

显示图像的代码:

while($row = mysql_fetch_row($result)) {
    echo "<tr>";
    echo "<td><img src='uploads/$row[6].jpg' height='150px' width='300px'></td>";
    echo "</tr>\n";
}

答案 1 :(得分:-2)

如果您的$ _GET []请求不安全: 只需执行以下步骤:

1)假设Url = localhost / hungry.com?id = 1

2)在网址末尾添加',例如:localhost / hungry.com?id = 1'如果输入错误,则您的$ _GET []不安全

3)让我们假设您的get var是这样的:$ piid = $ _ GET ['piid'];做到这一点:

$ piid =(int)($ _ GET ['piid']);只需添加(int),然后

4)在网址末尾添加',例如:localhost / hungry.com?id = 1'您将不会出现任何错误,这意味着您的$ _GET []现在安全了