如何为检查请求源提供更多安全性

pra*_*vin 8 php security csrf

我正在开发一个PHP Web应用程序,我想为应用程序提供更多安全性,以便没有人可以轻易地破坏功能.

关于我的问题的简要说明:在一个模块中有一个阶段,我正在检查请求的来源(来自此请求的来源)

目前,我正在使用HTTP_REFERRER变量(在php中可用).我正在使用一个特定的URL(例如http://www.example.com/test.php)检查此变量值.如果存在完全匹配,则只有我调用进一步的操作.

我对上述方法感到困惑,我是否应该使用HTTP_REFERRER或检查IP地址(如果来自任何特定的IP地址,有效请求)?

我也想知道提供安全性的更好方法.

有人有想法那么请分享?

提前致谢

Tre*_*eur 7

Web安全性的第1课:永远不要信任用户输入.当我说永远不会,我的意思是永远不会.;)包含PHP中的HTTP_REFER var,它很容易受到http标头的攻击(来源:http://www.mustap.com/phpzone_post_62_how-to-bypass-the-referer-se)

检查源的可能解决方案是使用表单令牌(csrf保护):http://www.thespanner.co.uk/2007/04/12/one-time-form-tokens/但不安全要么只能用你自己的来源.

一个简单的CSRF(跨站点请求伪造)保护示例:(因此很简单.对于更安全/更健壮的解决方案,请参阅The Rook的答案)

1)在您的表单页面中,创建某种令牌并将其放入您的会话和隐藏表单字段中:

<?php
    session_start();
    $csrfToken = md5(uniqid(mt_rand(),true)); // Token generation updated, as suggested by The Rook. Thanks!

    $_SESSION['csrfToken'] = $token;
?>
<form action="formHandler.php">
   <input type="hidden" name="csrfKey" value="<?php echo $csrfToken ?>" />
</form>
Run Code Online (Sandbox Code Playgroud)

2)在表单处理程序中检查令牌是否有效.

<?php
   session_start();
   if($_POST['csrfKey'] != $_SESSION['csrfKey']) {
      die("Unauthorized source!");
   }
?>
Run Code Online (Sandbox Code Playgroud)