PHP - 如何确定是否请求从一个特定的文件

问题描述:

未来我有fileA.php上SERVER_A和fileB.php上SERVER_BPHP - 如何确定是否请求从一个特定的文件

fileB.php使得以fileA.php卷曲请求它的内容

fileA.php如何确定请求是否来自fileB.php?

-

我在想送$ _ SERVER [“SCRIPT_NAME”]在fileB.php到fileA.php但因为有人可以进入fileB.php或一般的任何文件,只是做$ _ SERVER ['SCRIPT_NAME'] ='fileB.php';它并不是真的那么安全。

因此,出于安全原因,我如何确定请求来自不同服务器上的特定文件?

+2

你绝对需要这是100%安全吗?因为如果是这样,我建议你找到另一种做法。 – 2010-04-15 03:09:56

+0

是否需要公共访问fileA.php?如果你的问题是如何让fileA.php可以访问* only *到fileB.php,那么你可以看看使用HTTP身份验证来添加密码保护(然后可以指定密码作为参数在fileB.php中卷曲)。 – 2010-06-12 08:56:50

一旦你向服务器外请求,你确实无法控制。如果另一台服务器上的fileA具有中间人fileB的可能性,则需要重新考虑您的安全模型。具体情况是什么?

+0

好吧,如果我不能保护它,我不会编码它。这个特定的情况是我试图想出一种方法来在客户端服务器上运行代码,而不需要实际存在并且无法看到它。 我试图代码fileB.php {eval(file_get_contents(fileA.php));} 和fileA.php {ftp fileB.php - 如果fileB.php的md5是它的原始和请求来从fileB.php和一些其他的东西 - 给它从SERVER_A到eval的PHP代码,否则给它的东西评估像死()} 只是想看看我可以让PHP做=/ – Mickey 2010-02-21 05:57:16

+0

我的意思是卷曲,而不是file_get_contents,对不起。 – Mickey 2010-02-21 05:58:27

+2

这诚实地听起来注定要失败。没有一个好的方法来做到这一点。您可以提供一个已经被ioncube或zend编码器“加密”的脚本,并强制它们运行这些PHP模块,然后只提供加密的PHP,但这些已被证明不够安全。 – Xorlev 2010-02-21 08:03:51

一种方法是检查在PHP中

$_SERVER['HTTP_REFERER'] 

变量,但它是浏览器的决定,以填充此所以它不能被完全信任。

+0

cURL请求。 'Referer'头将不存在。 – 2010-02-21 05:23:51

+4

您可以使用cURL指定引荐来源的任意值。 – BojanG 2010-02-21 05:30:33

+0

欺骗性。不安全。 – mixdev 2010-06-28 19:48:55

你不能,可靠。您可以尝试设置HTTP标头并在另一侧验证;它不是傻瓜,但它比大多数都好。

如果第三方可以访问fileB.php,则可以做的事情很少。 REFERER不提供任何保护。 REMOTE_ADDR并不像欺骗那样微不足道,这可能会让你保证请求是合法的。

不可能的,因为你的说法:

"since someone can go into fileB.php" 

为什么不建立一个秘密的令牌,并验证其在接收端?

// fileB.php 

$url = "http://example.com/fileA.php" 
    . "?from=fileB" 
    . "&token=" . sha1('fileB' . 'myaw3som3_salt!') 
; 
// then make the cURL request. 


// fileA.php 
if (sha1($_GET['from'] . 'myaw3som3_salt!') != $_GET['token']) { 
    die(); 
} 

这是一个简单的例子,但你明白了。

+0

我使用这种技术将密码存储在数据库中,使用密钥sha1密码,但如果在这种情况下“标记”可以在url中查看,那么我检查了所有内容或者所有能够检查的密码甚至更容易欺骗 – Mickey 2010-04-21 07:59:35

+0

@John:在散列之前可能在字符串中包含'$ _SERVER ['HTTP_REFERER']'? – nickf 2010-04-21 14:56:00

我觉得nickf是点上,只是对他的回答扩大一点点,这里就是我会做:

  • fileB.php在Server1 Server2上
  • fileC请求fileC.php。 Server2上的php返回一个随机生成的盐,并将其存储在一个带有时间戳的文件或数据库中
  • Server1上的fileB.php请求Server2上的fileA.php,并将其作为请求主体发送预配置密钥,散列,并附加随机盐并再次散列(例如sha1(sha1('mypassword')。$ salt))
  • fileA.php检查是否在最近60秒内生成了一个盐,如果没有返回错误
  • fileA.php使用它的最后一个随机盐和预配置的键 - sha1(sha1('mypassword'))执行相同的散列。 $ salt),它与fileB.php发送的请求主体进行比较。如果它们匹配,fileA.php将授予对fileB.php的访问权限。
  • fileA.php删除生成的最后一个盐。
+0

另外,如果你担心中间人,使用HTTPS ...这可能是充分和合理的保护 – Zaahid 2010-06-12 01:59:59