【问题标题】:Execute perl from SHTML just includes the script, not eexecuted从 SHTML 执行 perl 只包含脚本,而不是 eexecuted
【发布时间】:2014-02-15 09:13:49
【问题描述】:

我在运行 Apache 2.2.25 的托管 linux Web 服务器上。以下 shtml 仅显示 perl 脚本的内容,而不是执行脚本。我知道脚本从 ssh 运行(我无权访问 ssh)。我确定我在 .htaccess 文件中遗漏了一些东西。任何帮助将不胜感激。

shtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Perl</title>
</head>
<body>

<!--#exec cgi="cgi-bin/test.pl"-->

</body>
</html>

perl (test.pl)

#!/usr/bin/perl
print "HELLO FROM PERL";

.htaccess

AddHandler cgi-bin .pl .cgi
AddType text/html .shtml .php
AddOutputFilter INCLUDES .shtml .php

Options +Includes

【问题讨论】:

    标签: perl .htaccess shtml


    【解决方案1】:

    ExecCGI

    我猜你的cgi-bin 目录不是ScriptAlias'ed,在这种情况下,除了设置处理程序之外,你还需要使用ExecCGI 选项:

    AddHandler cgi-script .cgi .pl
    Options +ExecCGI
    

    还要确保 Apache 对您的脚本具有执行权限。详情请见Configuring Apache to permit CGI

    #include virtual

    另外,您应该使用 SSI 命令#include virtual 而不是#exec cgi

    <!--#include virtual="/cgi-bin/test.pl" -->
    

    根据Apache manual

    使用#include virtual 几乎总是首选使用#exec cgi#exec cmd。前者 (#include virtual) 使用标准的 Apache 子请​​求机制来包含文件或脚本。它经过更好的测试和维护。

    更糟糕的是,#exec 可用于在您的网络服务器上运行任意代码。实际上最好完全禁用它:

    Options +IncludesNOEXEC
    

    #include 还允许您通过查询字符串将参数传递给您的 CGI,例如

    <!--#include virtual="/cgi-bin/test.pl?arg1=foo&arg2=bar" -->
    

    #exec 无法做到这一点。

    请注意,您传递给 #include virtual 的参数是相对于当前文档的 URL,不是文件路径。

    如果您还没有阅读,我建议您阅读 Apache 的 Introduction to Server Side Includes

    XBitHack

    最后,我更喜欢使用 XBitHack 指令,而不是要求 SSI 文件具有特殊的文件扩展名 (.shtml):

    XBitHack on
    

    任何设置了用户执行位的text/html 文件都将被解析为 SSI。这意味着当您想将 SSI 添加到文件时,您不必重命名文件(可能会破坏链接或用户的书签)。

    综合起来,我会这样设置.htaccess

    AddHandler cgi-script .cgi .pl
    Options +ExecCGI +IncludesNOEXEC
    XBitHack on
    

    【讨论】:

    • 我做了您建议的更改(谢谢)并得到错误 unable to include potential exec "/cgi-bin/test.pl" in parsed file /home/.../public_html /.../perl.shtml.
    • @Headforthehills 1) Apache 用户是否对test.pl 具有执行权限? 2) 尝试从#include&lt;!--#include virtual="cgi-bin/test.pl 中的URL 中删除前导/。另外,这是日志中唯一的错误吗?当我在测试设置中使用错误的 URL 时,Apache 记录了 File does not exist 错误,然后是 unable to include...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多