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

yiytaume  于 2023-08-06  发布在  PHP
关注(0)|答案(9)|浏览(171)

此问题在此处已有答案

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规则:

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

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

aiazj4mn

aiazj4mn1#

你可以用PHP

  1. <?php
  2. /* at the top of 'check.php' */
  3. if ( $_SERVER['REQUEST_METHOD']=='GET' && realpath(__FILE__) == realpath( $_SERVER['SCRIPT_FILENAME'] ) ) {
  4. /*
  5. Up to you which header to send, some prefer 404 even if
  6. the files does exist for security
  7. */
  8. header( 'HTTP/1.0 403 Forbidden', TRUE, 403 );
  9. die;
  10. }

字符串

j91ykkif

j91ykkif2#

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

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

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

k5ifujac

k5ifujac3#

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

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

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

hmtdttj4

hmtdttj44#

我尝试了选择的答案,但在实现它时遇到了一些问题,特别是如果我想使用GET和 AJAX 从PHP文件中的函数返回值。
在对其他解决方案进行了相当广泛的研究(以及我自己的一点测试)之后,我提出了以下代码:

  1. <?php
  2. $currentPage = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
  3. if ($_SERVER['REQUEST_METHOD'] == "GET" && strcmp(basename($currentPage), basename(__FILE__)) == 0)
  4. {
  5. http_response_code(404);
  6. include('myCustom404.php'); // provide your own 404 error page
  7. die(); /* remove this if you want to execute the rest of
  8. the code inside the file before redirecting. */
  9. }
  10. ?>

字符串
我发现上面的代码可以按照我想要的方式工作,我不认为它会像其他答案那样在多个浏览器中出现任何问题。我也不认为它会有任何安全问题,但我可能是错的(请告诉我,如果我是(为什么)),我是相对新的网络编程。
只需在您想要阻止直接URL访问的每个文件的顶部添加该代码(在所有内容之前,甚至是requires,includes和session_starts),您就可以开始了。

展开查看全部
shstlldc

shstlldc5#

这是Google在PHP示例中使用的

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

字符串

k4ymrczo

k4ymrczo6#

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

字符串

lxkprmvk

lxkprmvk7#

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

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

字符串

p3rjfoxz

p3rjfoxz8#

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

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

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

1zmg4dgp

1zmg4dgp9#

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

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

字符串

相关问题