2010-09-10 229 views
9

我在一个网站上有一些额外的功能,员工可以使用,但客户不允许看到。是否有可能欺骗你的IP地址...测试IP地址是否安全?

员工都将在一系列领域。

我要做的就是获得用户的IP,像这样:

$user_ip = gethostbyname($_SERVER['REMOTE_ADDR']); 

然后我得到的所有IP地址的域用户将阵列上使用gethostbyname

然后我检查用户在像这样的领域之一:

in_array($user_ip,$allowedIPS) 

因此,如果用户是在他们看到供内部使用的附加功能的领域之一。否则,他们只会看到公众意味着什么。

我的问题是,这是安全的吗?或者有人可能会欺骗他们的IP,使他们看起来像他们在我们的域名并获得这些功能?

+0

似乎在这里使用gethostbyname()是多余的。 '$ user_ip = $ _SERVER ['REMOTE_ADDR'];'就够了 – 2010-09-10 18:13:51

+0

@Col。弹片我认为这不是问题。 – RobertPitt 2010-09-10 18:19:42

+0

'$ _SERVER ['REMOTE_ADDR']'是用户的IP地址,如果我可以相信我的眼睛,那么您正在使用gethostbyname – 2010-09-10 18:20:26

回答

8

由于Three Way Handshake,无法通过开放互联网欺骗TCP连接。但是,也可以使用CSRF访问此功能。

PHP直接从Apache的TCP套接字中提取$_SERVER['REMOTE_ADDR'],因为它不会受到攻击者的影响。是的,我看过这个代码。

+0

所以如果我理解CSRF。具有允许的IP的员工访问不同的网站,其中有人使用CSRF欺骗员工的浏览器访问带有隐藏功能的页面。因此,通过员工的IP访问功能。但攻击者仍然无法看到这些功能,对吧?因为它是盲目的攻击。他们只能试图盲目地“使用”这些功能。对? – 2010-09-10 20:42:59

+1

@John Isaacks这是正确的。然而“使用csrf欺骗”是不好的措辞。 CSRF攻击是'''产生GET请求的'标签和'

',当页面或iframe被查看时自动执行'.submit()'。如果发生内部人攻击,我仍然会阻止CSRF。这可以像检查引用者一样简单。 – rook 2010-09-10 23:57:39

+0

真棒,谢谢! – 2010-09-13 13:08:51

-1

一切都是可能的,但它总是成本的问题。
在大多数情况下,这种欺骗不值得

+2

狗屎他们upvote琥珀为相同的答案。 – 2010-09-10 18:15:25

+6

可能是因为你的语法是吸吮 – davr 2010-09-10 18:18:41

+0

@davr - 不应该这样做吗? – 2010-09-10 18:19:12

2

如果非平凡,IP欺骗是可能的。

为什么不让员工登录才能访问员工专用功能?

+0

当你说“可能,如果不平凡”,你的意思是,这对存储银行账户等敏感信息并不正确,但对于像产品供应商这样不敏感的信息可以吗? – 2010-09-10 18:21:03

+1

一个很好的理由是支持成本。用自己的凭据申请可能会很快成为一个巨大的痛苦。如果他可以绑定到现有的LDAP或其他身份验证服务器上,那么即使不是,它也可以产生大量正在进行的工作。密码丢失,更改,需要添加新员工,需要删除已终止的员工等等。听起来不是很多,但是对于中型公司或更高级别的公司而言,确实会随着时间的推移累积起来。 – Serapth 2010-09-10 18:22:38

+0

[a]如果系统不是经常使用的系统,或者他们在一天中从多台计算机访问的系统,每次登录都是一个痛苦[b],他必须提供注册,登录,'忘记密码“和”忘记用户名“页面。 – egrunin 2010-09-10 18:23:04

2

我不认为这是可能的,因为当你向服务器发出请求时,你实际上请求你的ISP请求服务器。

只要您验证所有的HTTP元数据的ISP转发给你们,如X-FORWARDED-FOR和代理元,你应该能够保持一个紧密的系统..

继承人示意图,可以帮助您理解我的意思: alt text

在这里阅读更多信息。

http://www.astahost.com/info.php/hacker39s-view-easy-spoofing-ip-address_t13807.html

+0

我觉得你** ** **(在OSI堆栈的网络层)与**代理**(在应用层)混淆。现在很少有ISP使用真正的代理。 – 2010-09-10 18:28:57

8

我的问题是,这是安全的?或者有人可能会欺骗他们的IP,使他们看起来像他们在我们的域名并获得这些功能?

否,除非它们也可以访问其中一个IP的网络,或者其中一个IP所允许的任何机器受到攻击并代理流量。

在你的情况下,它似乎够好。那么,除非特权用户不会在没有某种VPN的情况下从其他IP访问内容。

请注意,IP spoofing通常与您正在使用的含义不同。它意味着只伪造一个数据包的源地址。这本身毫无价值,因为要访问该服务,还需要从服务器接收响应。即使在这个意义上的“IP欺骗”,由于更好的路由选择,今天也很少见。

+1

是和否 - 如果您只是想要更改某些内容(并且已经知道提交的正确请求),则回应并非总是必需的。它会阻止勘探,但不一定会被剥削。 – Amber 2010-09-10 18:34:36

+0

@Amber通过回应,我的意思是SYN/ACK数据包,而不是HTTP响应......它不会那么远。 – Artefacto 2010-09-10 18:42:22

+1

尽管这可能超出了问题的范围,但如果你有恶意的意图,TCP的序列号是可预测的,因此你可以预先发送一个“ACK”作为响应到数据包你知道另一端的服务器将发送。 – Amber 2010-09-10 18:46:57

2

如果你打算这样做,使用apache配置,而不是使用代码。你基本上正在重新发明内置的功能。

至于直接的问题,正如其他人所说,欺骗IP是可能的,如果不平凡。也希望你没有任何不安全的访问无线点。

编辑:Apache access control说明。这是我假设你使用Apache由于PHP的使用,如果你实际上使用IIS,它仍然是一个配置驱动的设置,但在执行中明显不同。

+0

谢谢,apache版本只适用于允许整个页面正确吗?我试图在页面上允许特定的功能。 – 2010-09-10 18:27:31

+0

是的。不过,从最佳做法来看,几乎可以保证您拥有安全与非安全的网站,而不是混合搭配方式。否则,我向你保证,对于你的系统来说任何复杂的东西,你都会在某个时候泄露机密信息,或者在未来造成维护噩梦。 – Serapth 2010-09-10 18:33:28

0

我在这个上了ROOK。您无法欺骗TCP连接,仍然可以在进行欺骗的同一台计算机上访问您的网站。为什么?因为你的网络服务器(最初)所做的响应是欺骗IP,试图建立一个套接字连接(TCP 3-way握手)。

可以想象,如果您有两台计算机(A和B)位于两个不同的公有IP地址,并且您使用其中一台计算机(A)使用B的IP地址欺骗或发送数据包到您的Web服务器,您的Web服务器回复它向B发送数据包。

如果欺骗呼叫中使用的IP地址在您的子网上是内部的,那么内部工作站将接收用于未初始化的TCP SYN数据包的TCP ACK数据包,并拒绝它们或忽略它们。我不知道有任何TCP/IP堆栈实现会尝试完成针对仅ACK数据包的3次握手;它打破了标准协议。

欺骗是UDP泛滥的技术,攻击者使用虚假的IP地址进行DoS(拒绝服务)攻击,试图隐藏他们的踪迹。

希望这会有所帮助。

0

$_SERVER['REMOTE_ADDR']由您的网络服务器提供,不可能直接欺骗它。我能看到的唯一方法是通过一个允许的IP代理连接。

0

当我们遇到类似的问题时,我们得出结论,如果用户通过http访问我们,我们不能完全依靠他们的IP地址,因为他们可能使用代理。但是https总是直接连接;它不允许代理,所以我们可以确定我们看到的IP地址是正确的。因此,我们根据IP地址PLUS锁定我们的用户,他们必须通过https访问该网站(当然,登录其帐户)。

你的情况听起来有点不同于我们的,但我会说上面应该对你有用。

即使您没有遵循确切的路径,您也需要了解代理。理论上,代理可以允许任意数量的不同用户从一个IP地址访问您的站点,因此如果您以某种方式设法将代理的IP地址添加到允许的地址列表中,那么您将会打开一个安全漏洞,因此您需要以确保您添加到列表中的任何IP地址都是合法的(这是https可以提供帮助的地方)。

此外,如果您的用户来自其家用PC,请注意他们的IP地址可能随时间而改变。大多数ISP会向其客户发布可重新分配的动态IP,这意味着每次连接到互联网时,都有可能获得不同的IP地址。如果是这种情况,则不会发生欺骗行为,但您无法通过其IP地址可靠地识别用户。