.htaccess 如果表单未提交,则防止PHP代码执行[重复]

yiytaume  于 10个月前  发布在  PHP
关注(0)|答案(9)|浏览(76)

此问题在此处已有答案

Checking if form has been submitted - PHP(9个回答)
19天前关闭
我有一个php文件说**“check.php”在我的网站,它是执行时,提交一个表格。
假设我的网站是
”myweb.com“**,php文件在目录“PHP”中
我想阻止直接URL访问“check.php”文件,即.如果任何人输入url“* myweb.com/PHP/check.php *”,那么php文件不应该被执行,它应该返回一个错误消息。
我试图通过在.htaccess中设置一个规则来阻止访问,但即使我试图提交表单,它也会阻止php。
.htaccess规则:

RewriteEngine on 
RewriteCond %{THE_REQUEST} \.php[\ /?].*HTTP/ 
(.*)\.php$ /index.html [L]

字符串
有什么可能的办法做这件事吗?

aiazj4mn

aiazj4mn1#

你可以用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 );
        die;
    }

字符串

j91ykkif

j91ykkif2#

将以下代码放在check.php的顶部:

if(!isset($_SERVER['HTTP_REFERER'])){
    // redirect them to your desired location
    header('location:../index.php');
    exit;
}

字符串
如果用户通过直接输入URL来访问check.php,它会将他们重定向到您想要的位置。

k5ifujac

k5ifujac3#

在Root/.htaccess中尝试以下操作:

RewriteEngine on

RewriteCond %{REQUEST_METHOD} !^POST$
RewriteRule ^php/check.php$ - [NC,R=404,L]

字符串
如果check.php没有被form post方法访问,则返回404 not found。

hmtdttj4

hmtdttj44#

我尝试了选择的答案,但在实现它时遇到了一些问题,特别是如果我想使用GET和 AJAX 从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访问的每个文件的顶部添加该代码(在所有内容之前,甚至是requires,includes和session_starts),您就可以开始了。

shstlldc

shstlldc5#

这是Google在PHP示例中使用的

if (php_sapi_name() != 'cli') {
  throw new \Exception('This application must be run on the command line.');
}

字符串

k4ymrczo

k4ymrczo6#

if (basename($_SERVER['SCRIPT_FILENAME']) === 'common.php')
{
    exit('This page may not be called directly!');
}

字符串

lxkprmvk

lxkprmvk7#

这个问题有很多答案,但我做了这样的事情。

<?php
    $page = basename($_SERVER['PHP_SELF']);
    
    if($page == "somefile.php"){
      header('Location: index.php');
    }
 ?>

字符串

p3rjfoxz

p3rjfoxz8#

试试这个。在check.php的顶部过去

<?php debug_backtrace() || die ("<h2>Access Denied!</h2> This file is protected and not available to public."); ?>

字符串
当直接在URL中访问文件时,将显示“拒绝访问

1zmg4dgp

1zmg4dgp9#

在我的例子中, AJAX 有一个问题。
对我很有效

if(!isset($_SERVER['HTTP_X_REQUESTED_WITH']) && ($_SERVER['HTTP_X_REQUESTED_WITH'] !== 'XMLHttpRequest')) {
  exit("Direct access denied.");
}

字符串

相关问题