保护您通过电子邮件发送的 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 链接的主要内容,如果未能解决你的问题,请参考以下文章