【问题标题】:Protect your delete.php links sended by email保护您通过电子邮件发送的 delete.php 链接
【发布时间】: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 的临时哈希字符串。将其放入数据库中。收到删除请求后,检查数据库中是否存在字符串。
  • 看来您正在从您的 ajax cal 调用 delete.php 从 ajax 发送一个带有 id 的令牌。验证令牌和 id 然后应用删除操作
  • 安全警告:md5(uniqid(rand(), TRUE)) 不是生成随机数的安全方法。
  • 你可以随时使用 RandomLib github.com/ircmaxell/RandomLib

标签: php mysql security hyperlink content-management-system


【解决方案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>';
}

【讨论】:

【解决方案3】:

你可以做一些事情,

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

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

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

【讨论】:

    猜你喜欢
    • 2016-04-08
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 2019-07-17
    • 2018-08-28
    相关资源
    最近更新 更多