我正在开发一个PHP Web应用程序,我想为应用程序提供更多安全性,以便没有人可以轻易地破坏功能.
关于我的问题的简要说明:在一个模块中有一个阶段,我正在检查请求的来源(来自此请求的来源)
目前,我正在使用HTTP_REFERRER
变量(在php中可用).我正在使用一个特定的URL(例如http://www.example.com/test.php)检查此变量值.如果存在完全匹配,则只有我调用进一步的操作.
我对上述方法感到困惑,我是否应该使用HTTP_REFERRER或检查IP地址(如果来自任何特定的IP地址,有效请求)?
我也想知道提供安全性的更好方法.
有人有想法那么请分享?
提前致谢
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)
归档时间: |
|
查看次数: |
4617 次 |
最近记录: |