PHP包括在短标签中运行,即使关闭短标签

时间:2017-08-23 14:59:43

标签: php

  

注意:
  这个问题不是关于在PHP中使用短标签。问题不是短标记本身,而是include函数似乎忽略此Plesk服务器上短标记的禁用状态的方式。

我有一个新网站需要处理和修复。该网站是由另一个人建造的,并且是多年前使用非最佳实践建造的。该网站最近被转移到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">

请注意:

我很清楚上述代码的缺失,但这不是我的工作,我的工作就是解决这些缺点并使其更好。

但是,我对include函数的行为感到困惑,并且已经阅读了various PHP错误报告以及阅读include和{{}的手册{3}}。没有一个提到这个问题。

我主要担心的是,在一段时间内,数据库连接细节会输出到HTML(显然已经改变了)。

2 个答案:

答案 0 :(得分:2)

在编译阶段但未在运行时读取包含的文件。

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

我可以想象其他原因:

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

此类处理的目的是通过最小化其磁盘访问来优化脚本。

答案 1 :(得分:0)

Plesk的帮助,呃,无益,响应者没有立即回答我的问题。

总的来说,他们看起来很谨慎,不愿意详细说明他们的PHP处理过程。他们只是说他们通过标准的Plesk安全扩展来运行所有PHP脚本。

这并没有告诉我很多,但Plesk响应者确实提出重新启用帐户上的短标签(我没有帐户的管理员权限,只有他的帐户有条目或转销商级访问权限不能自己编辑核心帐户php.ini)。

重新启用短标签显然解决了向浏览器输出PHP详细信息的问题。

我认为Plesk正在做类似as described by axiac的事情,所以我认为他/她的回答是正确的;虽然在这种情况下它没有解决问题,但它(很可能)似乎确定了它。