我刚读过这个article on tdwtf.com。通常,它描述了一个销毁机器人,因为它忽略了标题。然后我意识到我不知道如何在没有标题的页面中进行安全性。因此我的问题是:
除了使用标题之外,我还可以采取哪些安全措施?
我主要用php开发,所以我熟悉header(“Location:”)函数。但还有什么呢?
理想情况下,我希望取代
的逻辑if (!$something_important) header("Location: somehereharmless.php");
还有别的(更多)安全吗?
答案 0 :(得分:7)
这个很好用
if (!$something_important) {
header("Location: somehereharmless.php");
exit();
}
即使它是机器人,所以它不尊重位置,你会调用一个退出,所以执行流程无论如何都会停止,所以没有坏处
答案 1 :(得分:4)
标题:位置没问题,只要在末尾包含一个出口即可。 您可能还想要包含链接或其他内容。
我通常使用这样的东西:
<?php
function redirect($url)
{
header('Location: ' . $url);
exit('<a href="' . $url . '">Redirecting you to: ' . $url . '</a>');
}
redirect('somepage.php');
?>
这样人们就无法绕过重定向,并知道应该重定向它们。
[编辑]
此外,始终在删除内容时使用POST
。创建假GET
非常容易(例如<img src="http://www.example.org/action.php?do=SetAsAdmin&userid=MyUserId" />
)。
答案 2 :(得分:2)
确保所有获取都是幂等的
幂等意味着多次执行相同的请求与执行一次具有相同的效果。
答案 3 :(得分:2)
我想说如果你有一个PHP脚本执行某些操作,只有登录用户应该能够执行,你必须将检查记录为正确在同一个脚本中,所以你可以一目了然地看到代码是安全的。我的规则是,只有两种有效的模式来保护安全代码:
if (user_is_authorized()) {
// restricted code here
}
或Alekc的
if (!user_is_authorized()) {
// send headers or whatever if you want
exit();
}
// restricted code here
说实话,我感到非常震惊......或者至少令人失望......当我读到那篇文章时 - 我无法理解某人是如何得出一个网站可以通过HTTP标头保护的结论。标题只不过是服务器发送的一些文本。这是客户可以随意遵循或忽略的指令(至少,出于安全目的,您必须考虑这种方式)。就我而言,传出(响应)HTTP头对安全性来说几乎没用。 (这不计算HTTP身份验证之类的东西,你在那里发送一个标题并让一个回复...但在这种情况下,它是你的安全性所依据的回复标题的内容,而不是你发出的标题。)
答案 4 :(得分:1)
您提供的链接中报告的事件原因是exit;
之后缺少header();
声明。如果脚本停止,机器人不会造成任何伤害.-
答案 5 :(得分:1)
if (!$something_important) {
header("Location: somehereharmless.php");
//close all your db connections and other stuff you need to end..parhaps calling a function?
die("If the redirect doesnt start in 3 seconds, please <a href=\"somehereharmless.php\">click here</a>");
}
答案 6 :(得分:1)
您的解决方案
<?php
die($errormessage);
Die会暂停您的脚本,不会通过启动,也不会收集您不应该收集的任何数据。
答案 7 :(得分:0)
除了Alekc的回答。如果您有许多标题(“位置:”)语句,则该人员符合条件。最后一个将开火。
if($foo && $bar)
{
header("Location: somehereharmless.php");
}
if($foo && $baz)
{
header("Location: someotherplace.php");
}
因此,如果该用户设置了所有3个变量,他将被重定向到someotherplace.php。除非你有退出();或者死亡();在header();
之后