保护您通过电子邮件发送的 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>';
}
你可以做一些事情,
使用 post 方法而不是 get 方法进行数据操作。
您也可以使用代币,确保您重新生成您的代币
不仅要检查用户是否登录,还要确保登录用户有权删除/更新该记录。
如何保护我的 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>';
}
你可以做一些事情,
使用 post 方法而不是 get 方法进行数据操作。
您也可以使用代币,确保您重新生成您的代币
不仅要检查用户是否登录,还要确保登录用户有权删除/更新该记录。