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

Posted

技术标签:

【中文标题】保护您通过电子邮件发送的 delete.php 链接【英文标题】:Protect your delete.php links sended by email 【发布时间】:2017-05-27 12:43:14 【问题描述】:

如何保护我的 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;

当我登录时,一些黑客在我的电子邮件中发送了一个链接

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

该链接将删除我的文章或最糟糕的是我网站的完整主要部分,这是非常危险的。那么我怎样才能保护我的删除链接呢

【问题讨论】:

生成标识电子邮件和用户 ID 的临时哈希字符串。将其放入数据库中。收到删除请求后,检查数据库中是否存在字符串。 查看***.com/questions/6287903/… 看来您正在从您的 ajax cal 调用 delete.php 从 ajax 发送一个带有 id 的令牌。验证令牌和 id 然后应用删除操作 安全警告:md5(uniqid(rand(), TRUE)) 不是生成随机数的安全方法。 你可以随时使用 RandomLib github.com/ircmaxell/RandomLib 【参考方案1】:

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

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

一个例子可以在这里找到,preventing csrf in php

【讨论】:

Hacker 可以提供一些 javascript,它们发出 POST 请求,隐藏在链接中【参考方案2】:

您可以构建两步确认表单 当用户访问文章/delete.php?id=353 时,您只需计算一些哈希 'qweadasdasdqw' 并提供链接,就像这个文章/delete.php?id=353&hash=qweadasdasdqw

然后构建一些带有“你真的要删除文章吗?”问题的表单。 按钮“是”将为用户提供 url 文章/delete.php?id=353&hash=qweadasdasdqw , 按钮“否”将为用户提供文章列表。

所以如果hash是正确的,你会删除这篇文章

看一下代码

$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>';

【讨论】:

i.imgsafe.org/775addadf1.png number 可以轻松解密你需要使用php password_hash API php.net/manual/en/function.password-hash.php【参考方案3】:

你可以做一些事情,

    使用 post 方法代替 get 进行数据操作。

    您也可以使用令牌,确保您重新生成令牌

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

【讨论】:

以上是关于保护您通过电子邮件发送的 delete.php 链接的主要内容,如果未能解决你的问题,请参考以下文章

您如何通过电子邮件发送到 CL 中的用户列表?

CPEQ-playwithBooks隐私条款

发送电子邮件[关闭]

通过 PayPal 保护电子书下载链接

通过电子邮件发送的动态链接具有 url 防御

Tor (洋葱头)torbrowser