jjzjj

PHP include 在短标签中运行,即使短标签已关闭

coder 2024-04-07 原文

NOTE:
This question is NOT about using short tags in PHP. The issue is not the short tags themselves but the way that include functions seem to ignore the disabled status of short tags on this Plesk server.

我有一个新网站需要照顾和修复。该站点是由另一个人构建的,并且是多年前使用非最佳实践构建的。该站点最近已移至 Plesk 服务器。

我不熟悉 Plesk,所以一直在学习它的例程。

我的问题是:

Plesk PHP 设置的核心设置是禁用短标签 (<? ... ?>)。我正在处理的网站广泛使用了短标签(以及完整的 <?php 标签)。

问题是 PHP include 短标签内的代码函数仍然执行和加载,其内容仍然输出到浏览器源 HTML,但短标记中的任何其他内容都不会执行。

为什么会这样?

  • 这是 Plesk 的问题吗?
  • 这是 include 的错误吗? ?

服务器设置:

  • Plesk Onyx(我找不到版本号)
  • PHP 5.6.31(处理程序:FPM 应用程序)
  • PHP ini(直接从站点加载):short_open_tag: Off
  • 包含的 PHP 文件使用完整标签和短标签,结果相同。

我的代码:

HTML 页面(index.php,各种页面):

<?
session_start();
include "inc/dbi.php";
if(isset($_REQUEST['id'])){
    $id = substr($_REQUEST['id'],0,6);
}
else{
    header("Location: index.php?msg=No image specified");
    exit;
    }
$qry        = mysqli_query($MySQlink,"...");
$row        = mysqli_fetch_array($qry);
$docwidth   = floor($row['width']*4.26);
$docwidth  /= 100;
$docheight  = floor($row['height']*04.26);
$docheight /= 100;
$descr      = nl2br($descr);
?>
<!DOCTYPE HTML>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
...
...

inc/dbi.php 页面:

<?php
$user     = "some_user";
$pass     = "some_pass";
$db       = "some_db";
$MySQlink = mysqli_connect( "localhost" , $user, $pass, $db );
if ( ! $MySQlink )  {   mysqli_close($MySQlink);    }
$now      = date('Y-m-d H:i:s');    
$today    = date('Y-m-d '); 

我希望在 HTML 文件的源代码中看到的内容:

<?
session_start();
include "inc/dbi.php";
if(isset($_REQUEST['id'])){
    $id = substr($_REQUEST['id'],0,6);
}
else{
    header("Location: index.php?msg=No image specified");
    exit;
    }
$qry        = mysqli_query($MySQlink,"...");
$row        = mysqli_fetch_array($qry);
$docwidth   = floor($row['width']*4.26);
$docwidth  /= 100;
$docheight  = floor($row['height']*04.26);
$docheight /= 100;
$descr      = nl2br($descr);
?>
<!DOCTYPE HTML>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

我实际看到的:

<?
session_start();
$user     = "some_user";
$pass     = "some_pass";
$db       = "some_db";
$MySQlink = mysqli_connect( "localhost" , $user, $pass, $db );
if ( ! $MySQlink )  {   mysqli_close($MySQlink);    }
$now      = date('Y-m-d H:i:s');    
$today    = date('Y-m-d '); 

if(isset($_REQUEST['id'])){
    $id = substr($_REQUEST['id'],0,6);
}
else{
    header("Location: index.php?msg=No image specified");
    exit;
    }
$qry        = mysqli_query($MySQlink,"...");
$row        = mysqli_fetch_array($qry);
$docwidth   = floor($row['width']*4.26);
$docwidth  /= 100;
$docheight  = floor($row['height']*04.26);
$docheight /= 100;
$descr      = nl2br($descr);
?>
<!DOCTYPE HTML>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

请注意:

我很清楚上面代码的缺点,但这不是我的工作,我的工作是修复这些缺点并使它 [much] 更好。

但是,我对 include 函数的行为感到困惑,并且已经阅读了 various PHP 错误报告以及阅读 include 的手册和 PHP.ini short tags .其中都没有提到这个问题。


我主要担心的是,在一段时间内,数据库连接详细信息会输出到 HTML(显然,此后已更改)。

最佳答案

包含的文件不会在编译阶段读取,而是在运行时读取。

由于您的 PHP 解释器不解释短标记中的代码并将其直接转储到浏览器,因此将 include 语句替换为包含文件的内容是无罪的。
没有 php.ini 设置可以说服它这样做。

我能想到其他原因:

  • 用包含文件的内容替换 include/require 语句的 PHP 扩展;
  • 一个预处理脚本,它执行相同的操作和/或将多个 PHP 文件组合成一个文件(Symfony 做类似的事情);

这种处理的目的是通过最小化磁盘访问来优化脚本。

关于PHP include 在短标签中运行,即使短标签已关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45843239/

有关PHP include 在短标签中运行,即使短标签已关闭的更多相关文章

  1. ruby - 在院子里用@param 标签警告 - 2

    我试图使用yard记录一些Ruby代码,尽管我所做的正是所描述的here或here#@param[Integer]thenumberoftrials(>=0)#@param[Float]successprobabilityineachtrialdefinitialize(n,p)#initialize...end虽然我仍然得到这个奇怪的错误@paramtaghasunknownparametername:the@paramtaghasunknownparametername:success然后生成的html看起来很奇怪。我称yard为:$yarddoc-mmarkdown我做错了什么?

  2. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  3. ruby - 如何关闭 ruby​​ gem "Spreadsheet?"中的文件 - 2

    下面的代码在我第一次运行它时就可以正常工作:require'rubygems'require'spreadsheet'book=Spreadsheet.open'/Users/me/myruby/Mywks.xls'sheet=book.worksheet0row=sheet.row(1)putsrow[1]book.write'/Users/me/myruby/Mywks.xls'当我再次运行它时,我会收到更多消息,例如:/Library/Ruby/Gems/1.8/gems/spreadsheet-0.6.5.9/lib/spreadsheet/excel/reader.rb:11

  4. css - 用 watir 检查标签类? - 2

    我有一个div,它根据表单是否正确提交而改变。我想知道是否可以检查类的特定元素?开始元素看起来像这样。如果输入不正确,添加错误类。 最佳答案 试试这个:browser.div(:id=>"myerrortest").class_name更多信息:http://watir.github.com/watir-webdriver/doc/Watir/HTMLElement.html#class_name-instance_method另一种选择是只查看具有您期望的类的div是否存在browser.div((:id=>"myerrortes

  5. ruby - 如何在 ruby​​ 中运行后台线程? - 2

    我是ruby​​的新手,我认为重新构建一个我用C#编写的简单聊天程序是个好主意。我正在使用Ruby2.0.0MRI(Matz的Ruby实现)。问题是我想在服务器运行时为简单的服务器命令提供I/O。这是从示例中获取的服务器。我添加了使用gets()获取输入的命令方法。我希望此方法在后台作为线程运行,但该线程正在阻塞另一个线程。require'socket'#Getsocketsfromstdlibserver=TCPServer.open(2000)#Sockettolistenonport2000defcommandsx=1whilex==1exitProgram=gets.chomp

  6. 即使安装了 gem,Ruby 也找不到所需的库 - 2

    我花了几天时间尝试安装ruby​​1.9.2并让它与gems一起工作:-/我最终放弃了我的MacOSX10.6机器,下面是我的Ubuntu机器上的当前状态。任何建议将不胜感激!#rubytest.rb:29:in`require':nosuchfiletoload--mongo(LoadError)from:29:in`require'fromtest.rb:1:in`'#cattest.rbrequire'mongo'db=Mongo::Connection.new.db("mydb")#gemwhichmongo/usr/local/rvm/gems/ruby-1.9.2-p0/g

  7. ruby-on-rails - Ruby 的 'open_uri' 是否在读取或失败后可靠地关闭套接字? - 2

    一段时间以来,我一直在使用open_uri下拉ftp路径作为数据源,但突然发现我几乎连续不断地收到“530抱歉,允许的最大客户端数(95)已经连接。”我不确定我的代码是否有问题,或者是否是其他人在访问服务器,不幸的是,我无法真正确定谁有问题。本质上,我正在读取FTPURI:defself.read_uri(uri)beginuri=open(uri).readuri=="Error"?nil:urirescueOpenURI::HTTPErrornilendend我猜我需要在这里添加一些额外的错误处理代码...我想确保我采取一切预防措施来关闭所有连接,这样我的连接就不是问题所在,但是我

  8. ruby - Faye WebSocket,关闭处理程序被触发后重新连接到套接字 - 2

    我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d

  9. ruby - 在 rake 任务中运行 capybara - 2

    如何在Rake任务中运行Capybara功能?例如:访问('http://google.com')谢谢! 最佳答案 在任务中尝试这样的事情:require'capybara'require'capybara/dsl'Capybara.current_driver=:seleniumBrowser=Class.new{includeCapybara::DSL}page=Browser.new.pagepage.visit("http://www.google.com")puts(page.html)

  10. ruby-on-rails - 如何在 gem 中运行 Rails 应用程序? - 2

    我不确定这种事情是否很常见,但我一直在尝试创建只是Rails应用程序包装器的gem。我的gem将有一个生成器来创建config.ru,但Rails应用程序将位于gem的lib目录中。我需要知道如何“嵌入”Rails应用程序并对其进行配置,以便它可以在gem中运行。例如:$mygemnewprojectmygemcreatedadirectorycalled"project"withthefollowingfiles:project/config.ruproject/widgets/project/foobars/我的gem还将生成一些需要以某种方式添加到Rails的目录,以便我可以从G

随机推荐