如何检查请求是来自同一台服务器还是来自不同的服务器?

php
2022-08-30 14:39:49

如何检查收到的请求是否从同一台服务器发送?

比如说,我的域名在 www.domain.com。现在我有php处理文件,它将处理通过这个域托管的表单。仅当请求是从域(即)内发送时,才会执行此过程。www.domain.com 和从其他域发送的任何其他请求都将被丢弃。


答案 1

基本上:你不能。
使用HTTP协议,每个请求都独立于其他请求。


第一个想法是检查 Referer HTTP 标头,但请注意:

  • 它可以是伪造的(由浏览器发送)
  • 它并不总是存在。

所以:不是一个可靠的解决方案。


一个可能的,并且比Refer的想法要好得多,解决方案可能是使用nonce

  • 显示表单时,在其中放置一个隐藏的输入字段,其中包含一个随机值
  • 同时,将该随机值存储到与用户对应的会话中。
  • 提交表单后,请检查隐藏字段的值是否与会话中存储的值相同。

如果这两个值不相同,请拒绝使用提交的数据。

注意:这个想法通常用于帮助对抗CSRF - 并集成到一些框架(例如Zend框架)的“表单”组件中。


答案 2

这将检查是否存在引用,然后它将它与当前域进行比较,如果不同,则它来自外部引用

if ((isset($_SERVER['HTTP_REFERER']) && !empty($_SERVER['HTTP_REFERER']))) {
if (strtolower(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST)) != strtolower($_SERVER['HTTP_HOST'])) {
// referer not from the same domain
}
}

推荐