保护您通过电子邮件发送的 delete.php 链接

Protect your delete.php links sended by email

如何保护我的 delete.php 个文件

$id = (int) $_GET['id'];
$delete = $connection->prepare("DELETE FROM `articles` WHERE `id` = :id");
$delete->execute(['id' => $id]);
if($delete->rowCount() > 0){
   echo 'SUCCESS';
}else{
   echo 'ERROR';
}

假设我已登录我的网站面板并且我的会话已开启

 $_SESSION['user_id'] = My_ID;

一些黑客在我登录时向我的电子邮件发送 link

 <img src="http://my.website.com/panel/articles/delete.php?id=353">

link 将删除我的文章或最糟糕的是我网站的完整主要部分,这非常危险。那么我怎样才能从那个

中保护我的删除links

这是一个很好的例子,为什么在HTTP RFC中声明,GET方法应该只用于请求数据,而应该使用for the data manipulation it's POST方法。

为了保护 POST 表单免受此类欺诈,必须使用通常的 CSRF 保护。简而言之,每个表单都应该使用一个秘密令牌进行签名,该令牌也存储在会话中。因此网站将能够验证表单是否由引擎发布。

可以在此处找到示例,preventing csrf in php

您可以构建两步确认表单
当用户转到 articles/delete.php?id=353 时,您只需计算一些哈希 'qweadasdasdqw' 并提供 link 就像这样 articles/delete.php?id=353&hash=qweadasdasdqw

然后构建一些带有问题的表格 'Do you really want to delete article?' 按钮 'yes' 将为用户提供 url articles/delete.php?id=353&hash=qweadasdasdqw , 按钮 'no' 将向用户提供文章列表。

因此,如果哈希值正确,您将删除这篇文章

看看代码

$hash = isset($_GET['hash']) ? $_GET['hash'] : null;
$id = (int) $_GET['id'];
if (isset($hash) && (md5($id) == $hash)) { // Check hash
    $delete = $connection->prepare("DELETE FROM `users` WHERE `id` = :id");
    $delete->execute(['id' => $id]);
    if($delete->rowCount() > 0){
       echo 'SUCCESS';
    }else{
       echo 'ERROR';
    }
} else {
    $hash = md5($id); // Generate hash todo use more security function
    echo 'Do you really want to delete this article? <a href="http://my.website.com/panel/articles/delete.php?id=' . $id . '&hash=' . $hash .'">yes</a>';
}

你可以做一些事情,

  1. 使用 post 方法而不是 get 方法进行数据操作。

  2. 您也可以使用代币,确保您重新生成您的代币

  3. 不仅要检查用户是否登录,还要确保登录用户有权删除/更新该记录。