2010-07-06 32 views
2

我正在写一个PHP脚本,我想禁止从Web访问(我会要求用户将其移出Web根并通过CLI执行,但您永远不知道它们是否会会听!)如何使PHP页面在浏览器中被禁用

是否有一个简单的功能,发生任何人使页面死亡,如果它的浏览器请求?

感谢您的任何想法。

回答

6

您可以使用php_sapi_name()来测试脚本是否正在通过CLI运行。

它可以在HTTP服务器上运行时返回大量不同的可能值 - 难以在那里进行可靠区分 - 但CLI似乎只有一个可能的返回值:cli

如果您正在寻找一种通用解决方案,请确保阅读下面的评论主题以获取关于某些潜在问题的更详细讨论。

+1

只是检查由*米哈尔警告在roszka点PL *上的[php_sapi_name()](http://php.net/manual/en/function.php-sapi-name。 PHP)页面。我记得以前遇到过这个问题(虽然很久以前,所以我不能具体说明)。我最终使用[$ _SERVER](http://php.net/manual/en/reserved.variables.server.php),因为它在作为CLI运行时产生明显不同的输出。我认为检查$ _SERVER ['argv']'是否存在就足够了。 – Mike 2010-07-06 20:33:03

+0

@Mike好点和重要的陷阱!另一方面,我过去也遇到过'$ _SERVER []'检查类似的问题 - 一次在测试服务器上运行的生产服务器上的CLI测试失败。但是我不能确定哪一个数组键是我当时检查过的,但我必须查看它。缺少'$ _SERVER [“REMOTE_ADDR”]'也可能是一个指示器 - 但我确信会有一些异国情调的服务器在http模式下不传递它。 Arrrghhh .... :) – 2010-07-06 20:37:38

+0

感谢pekka,马克,user257493和所有的意见。我要这样做,假设它会在大多数情况下工作。我很欣赏讨论和很好的解释! – julio 2010-07-06 22:44:12

0

您可以使用php-sapi-name函数检测脚本是否被Web服务器或CLI接口请求。

1

我不是PHP专家,但你可以检查$ _SERVER变量?

0
$sapi_type = php_sapi_name(); 
if (substr($sapi_type, 0, 3) != 'cli') { 
    die "You are not using CLI".PHP_EOL; 
} 
0

您可以使用PHP-SAPI名称,或者您可以使用预定义常数是稍快(尽管你从来没有注意到!)

<?php 
if(PHP_SAPI != 'cli') exit; 
// continue 
+0

这对我的回答有评论中讨论的潜在问题。 – 2010-07-06 20:44:18

+0

它有0个问题,因为你注意到自己“但似乎只有一个可能的CLI返回值:cli';) – nathan 2010-07-06 20:45:25

+0

nope,阅读@ Mike的评论,它不是100%真实的,它可能是'cgi'或' fgci'在一些非常罕见的情况下。这可能是值得的选择,因为听起来像OP想要一个通用的解决方案。但在正常情况下,我同意它会足够好。 – 2010-07-06 20:47:49

4

'PHP_SELF' 的文件名 当前正在执行脚本,相对于文档根目录 。例如, $ _SERVER ['PHP_SELF']在 的脚本中的地址为 http://example.com/test.php/foo.bar 将是/test.php/foo.bar。常量包含当前文件(即包含 )文件的完整路径和文件名。如果PHP作为 命令行处理器运行,则此变量 包含自PHP 4.3.0起的脚本名称。以前它不可用。

http://www.php.net/manual/en/reserved.variables.server.php

+1

嘿,很好!我喜欢这一点,它绕过了评论中提到的CLI/CGI问题。必须检查它是路径还是URL。无法看到任何陷阱 - 不同意见,任何人? +1 – 2010-07-06 20:40:38

相关问题