【问题标题】:Securing a $_GET request in PHP [duplicate]在 PHP 中保护 $_GET 请求 [重复]
【发布时间】:2018-05-18 08:04:49
【问题描述】:

保护 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.";
    }
}

【问题讨论】:

  • 首先,如果允许用户删除文件,您可以为用户添加权限。如果授予权限,则在删除文件之前,您必须首先获取具有给定 id 的文件并检查经过身份验证的用户是否拥有该文件..
  • 您包含auth.php,这似乎暗示您需要某人登录才能执行该操作?您是否还检查登录用户是否有权删除他们请求的特定文件? $_GET 本质上并不比其他方法安全,除了它在浏览器栏上可见,因此站在你后面的人可以阅读它。
  • “安全”以什么方式?那么不允许删除某些内容的用户不能删除某些内容吗?这要求服务器在删除之前检查该权限,简单明了(无论您的标准是什么,我们都不知道)。此外,不要使用 GET 请求来删除(或通常修改任何状态)。可以使用 URL 查询参数($_GET),但 HTTP 请求方法必须是 POST(实际上是 DELETE)。否则,Google 只会通过抓取来清空您的网站(如果您还缺少权限检查……)。
  • @deceze 你有我可以阅读的关于删除请求的网站链接吗?
  • en.wikipedia.org/wiki/… - 但在浏览器中,只有 GET 和 POST 可以从普通表单中使用;其他任何你需要 Javascript 的东西。

标签: php security get sql-injection


【解决方案1】:

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

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

HTML 代码:

<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";
}

【讨论】:

    【解决方案2】:

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

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

    2) 在 url 的末尾添加 ' 例如:localhost/hungry.com?id=1' 如果它给出错误,那么你的 $_GET[] 是不安全的

    3) 假设您的 get var 是这样的: $piid=$_GET['piid'];做这个:

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

    4) 在 url 末尾添加 ' 例如:localhost/hungry.com?id=1' 你不会收到任何错误 这意味着你的 $_GET[] 现在是安全的

    【讨论】:

      猜你喜欢
      • 2015-02-03
      • 2020-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多