保护没有标题的网页

时间:2009-04-08 08:30:54

标签: php security http-headers

我刚读过这个article on tdwtf.com。通常,它描述了一个销毁机器人,因为它忽略了标题。然后我意识到我不知道如何在没有标题的页面中进行安全性。因此我的问题是:

除了使用标题之外,我还可以采取哪些安全措施?

我主要用php开发,所以我熟悉header(“Location:”)函数。但还有什么呢?

理想情况下,我希望取代

的逻辑
if (!$something_important) header("Location: somehereharmless.php");

还有别的(更多)安全吗?

8 个答案:

答案 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();

之后