如何防止HTTP欺骗攻击?

5
我们使用PHP创建了一个数据库驱动的网站,使用了设置cookie,并且现在需要防止HTTP欺骗,有什么建议吗?我们是初学者,所以任何帮助都将不胜感激。

在安全问题解决后,将上传已完成的翻译文本。 - Jermain
5个回答

6
您无法“欺骗”HTTP请求。您向服务器发送请求,服务器会做出相应的回应。
我认为您试图防止的是cookie欺骗。考虑到cookie存储在客户端,您无法阻止用户修改其内容。
不要在cookie中存储敏感信息。它们不安全,易于被客户端读取和修改。
改用PHP会话。有关会话如何工作以及如何保持安全的完整说明可以在我的先前答案之一中阅读。
基本上,保护会话有两个方面:
- 预防会话固定 每X个请求重新生成一个新的session_id,以减少攻击者窃取id的时间。 - 唯一标识客户端 使用IP和/或User-Agent唯一标识客户端,并在每次页面加载时检查该值是否与存储在会话中的值相匹配。这确实是您唯一两个唯一标识客户端的选择。
即使采取了这些措施,也没有绝对可靠的解决方案,一旦您的session_id被破解,您就基本上无法防范。
再次强调,有关详细说明,请参见我的先前答案之一

@Jermain:如果你愿意,可以点击我回答左侧的勾选标记,将我的回答设为你所接受的答案。 - Andrew Moore
@Jermain,您已经注册了。您需要做的就是点击答案左侧的绿色勾号,以表示此答案有帮助。 - Daniel Vassallo
@DeveloperChris:方法2的所有缺点都在我的长回答中解释了。是的,User-Agent不安全,但这仍然比完全没有好。 - Andrew Moore
哦,这就是负载均衡器的作用。每秒钟它都会决定将负载发送到哪里。如果你正在进行一个会话并且在提交了那篇漫长而艰苦的文章后突然被踢出,那么你有权生气。关键是,除非你知道IP地址不会改变,否则不要使用它们。 - DeveloperChris
这是可以理解的,但既然应用程序编写者和浏览器都无法控制负载均衡器或代理的配置,并且有足够多的东西破坏了“良好实践”,我仍然主张为了您的客户和自己的健康状态而不要这样做,以应对将出现的奇怪投诉。除非您确定您的客户/客户端都使用固定IP。 - DeveloperChris
显示剩余6条评论

2
什么是欺骗?HTTP只是一种传输数据的协议,它本身并不会被欺骗。要做的事情不是防止信息欺骗,而是从不信任客户端。在处理cookie时,存储一个散列伪随机值,并在接受cookie数据之前将其与数据库进行比较。
更新:考虑到您特别关注cookie,我将更深入地解释一下。存储cookie时有两个主要问题:
1. 不要存储实际数据 2. 验证数据库
例如,您想拥有一个存储个人数据的用户站点。在cookie中,可以存储用户名或用户ID以及在用户登录时还存储在数据库中的散列安全令牌。安全令牌不可知,并且每次登录都会更改。任何个人信息都留存在数据库中,永远不会存储在cookie中。
建议阅读以下最佳实践: http://jaspan.com/improved_persistent_login_cookie_best_practice

我们需要检测伪造HTTP消息的尝试,如果这有帮助的话? - Jermain
也许你可以描述一个具体的例子,说明你认为可能发生的情况。 - Elle H
如果有人发现了PHP用于管理会话的cookie,那么有什么办法阻止另一台机器上的某个人手动设置相同值的cookie并冒充你呢? - Jermain

2
如果你想要防止 中间人攻击 窃听,你可能想要使用 HTTPS,它在网络上创建了一个安全通道,前提是使用了足够的密码套件并且服务器证书得到了 验证和信任注意: 最初的问题含义不明确。现在已经清楚该问题是关于 cookie 欺骗的。

1
问题实际上是无意义的,因此这个答案提供了对其中一种解释的好建议。 - deceze
是的,我提到过我是个新手,所以请考虑一下这一点,毕竟每个人都要从某个地方开始。 - Jermain

0

欺骗攻击?身份被盗的唯一真正问题是 cookie 泄露。

你可以做的是,每当通过 HTTP 标头发送 cookie 时,检查其是否与发行的 IP 地址相匹配。例如:

<?php
session_start();
$rec = db_query('select count(*), ip from session where session_id = "' . session_id() . '"');

list ($last_count, $last_ip) = $rec[0];

if (! $last_count) {
    # add it into the database
    db_query('insert into session (session_id, ip) values (' .
        '"' . session_id() . '", ' .
        '"' . $_SERVER['REMOTE_ADDR'] . '"' . 
    ')');
} else {
    if ($last_ip != $_SERVER['REMOTE_ADDR']) {
        print "user has stolen a cookie!";
    }
}
?>

但是这可能会对那些由ISP分配动态IP地址的人产生负面影响。


我不确定这个“建议”有多少用处。这不仅会捕捉到动态IP地址的用户,还包括使用笔记本电脑等移动设备的用户。即使是从一个办公室到另一个办公室的移动也足以让你的代码将他们识别为cookie窃贼。我不建议使用这个方法。 - T9b

0

我知道这个问题已经有答案了,但我想再加上另一种技巧,我自己使用的,对于管理登录特别有用。像往常一样使用会话(session),但将目录保护加入其中。

这样一来,如果一个会话被劫持,劫持者也必须能够获取目录登录。

我在论坛管理中使用这种技巧。某些论坛容易被黑客攻击,这样可以减少黑客进入并造成严重问题的机会。

DC


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接