防止直接 url 访问 php 文件
Posted
技术标签:
【中文标题】防止直接 url 访问 php 文件【英文标题】:prevent direct url access to php file 【发布时间】:2016-03-04 03:22:10 【问题描述】:我的网站中有一个名为 "check.php" 的 php 文件,它在提交表单时执行。
假设我的网站是 "myweb.com" 并且 php 文件在目录 "PHP" 中
我想阻止对“check.php”文件的直接 url 访问,即如果有人键入 url “myweb.com/PHP/check.php”,那么 php 文件不应该被执行,它应该返回一个错误信息。
我试图通过在 .htaccess 中设置规则来阻止访问,但即使我尝试提交表单,它也会阻止 php。
.htaccess 规则:
RewriteEngine on
RewriteCond %THE_REQUEST \.php[\ /?].*HTTP/
(.*)\.php$ /index.html [L]
有什么办法吗?
【问题讨论】:
【参考方案1】:这个问题有很多答案,但我做了类似的事情。
<?php
$page = basename($_SERVER['PHP_SELF']);
if($page == "somefile.php")
header('Location: index.php');
?>
【讨论】:
【参考方案2】:if (basename($_SERVER['SCRIPT_FILENAME']) === 'common.php')
exit('This page may not be called directly!');
【讨论】:
【参考方案3】:这是 google 在他们的 php 示例中使用的
if (php_sapi_name() != 'cli')
throw new \Exception('This application must be run on the command line.');
【讨论】:
【参考方案4】:我尝试了选择的答案,但在实现它时遇到了一些问题,特别是如果我想使用带有 Ajax 的 GET 从 PHP 文件中的函数返回值。
在对其他解决方案进行了相当广泛的研究(以及我自己的一些测试)之后,我想出了以下代码:
<?php
$currentPage = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
if ($_SERVER['REQUEST_METHOD'] == "GET" && strcmp(basename($currentPage), basename(__FILE__)) == 0)
http_response_code(404);
include('myCustom404.php'); // provide your own 404 error page
die(); /* remove this if you want to execute the rest of
the code inside the file before redirecting. */
?>
我发现上面的代码可以按我的意愿工作,我认为它不会像其他答案那样对多个浏览器有任何问题。我也不认为它会有任何安全问题,但我可能是错的(如果我是(以及为什么)请告诉我),我对网络编程比较陌生。
只需将该代码添加到您想要阻止直接 URL 访问的每个文件的顶部(在所有内容之前,甚至在需要、包含和 session_starts 之前),您就可以开始了。
【讨论】:
URL 末尾的查询字符串 (?) 破坏了这可能是因为当前页面与文件名不匹配。【参考方案5】:也试试这个。过去在 check.php 的顶部
<?php debug_backtrace() || die ("<h2>Access Denied!</h2> This file is protected and not available to public."); ?>
直接在url中访问文件时会出现Access Denied
【讨论】:
【参考方案6】:将此代码放在check.php的顶部:
if(!isset($_SERVER['HTTP_REFERER']))
// redirect them to your desired location
header('location:../index.php');
exit;
如果用户通过直接输入 URL 来访问 check.php,它会将他们重定向到您想要的位置。
【讨论】:
我不推荐这个。出于隐私原因,某些浏览器(如 Firefox)允许用户隐藏 Referer 标头。 这里是旧帖子,但谢谢!我会添加它。我一次又一次地认为 HTTP_REFERER 变量可以被欺骗,但它仍然是另一个无害的工具,可以抵御一些试图攻击我的脚本的人,用黑客尝试填充我的日志。而且,如果您已经有漂亮的模式来警告访问者以确保启用 cookie 等,那么当脚本失败时,我想在某种程度上,无法使用我提供的页面资源是他们自己的错..跨度> 【参考方案7】:在 Root/.htaccess 中试试这个:
RewriteEngine on
RewriteCond %REQUEST_METHOD !^POST$
RewriteRule ^php/check.php$ - [NC,R=404,L]
如果表单post方法没有访问check.php,这将返回404 not found。
【讨论】:
^php/check.php$中的'php'表示PHP目录还是文件类型? @ItAssistors 是的,您删除它以将其分配给另一个文件,或者只需在 ^ 和 $ 之间键入根。 这不是一个解决方案,因为 post 方法很容易在客户端被欺骗。【参考方案8】:你可以用 PHP 做到这一点
<?php
/* at the top of 'check.php' */
if ( $_SERVER['REQUEST_METHOD']=='GET' && realpath(__FILE__) == realpath( $_SERVER['SCRIPT_FILENAME'] ) )
/*
Up to you which header to send, some prefer 404 even if
the files does exist for security
*/
header( 'HTTP/1.0 403 Forbidden', TRUE, 403 );
/* choose the appropriate page to redirect users */
die( header( 'location: /error.php' ) );
?>
【讨论】:
我将它添加到我的 php 文件中,但即使在表单发布操作中,它也会将其重定向到错误页面。无论如何要排除post方法 对此感到抱歉 - 希望这样可以解决问题。然而,@Starkeen 使用.htaccess
文件的方法可能更好~尽管使用 PHP 确实允许您在重定向用户之前做其他事情 - 即:将命中记录到数据库等
你的方法很有魅力。我只是应用了一点编辑而不是 $_SERVER['REQ.....] == 'GET' 我使用了 .... != 'POST' 因为我使用 post 方法,它应该仅在请求时显示错误不是“发布”谢谢...
很有希望,但无法让它发挥作用。也许我不明白,但我写了一个简短的 PHP 来退出(),响应字符串显示 realpath($_SERVER['SCRIPT_FILENAME']) 和 realpath(FILE) 的内容。无论我是直接将脚本路径插入浏览器,还是从页面上的 XMLHttpRequest() 运行它,这两个字符串都是相同的。我正在阻止使用 cookie 的直接尝试,它似乎有效。当我看到我的日志充满了一些白痴的尝试和尝试时,这真是令人讨厌。希望有办法,比如 BROWSER 数组之类的。以上是关于防止直接 url 访问 php 文件的主要内容,如果未能解决你的问题,请参考以下文章