html 中使用 ssi 指令

SSI 即 Server Side Include,是一种基于服务端的网页制作技术


Apache 开启 SSI 支持

  • 首先开启模块 mod_include

    LoadModule include_module modules/mod_include.so
    
  • httpd.conf 或 主配置中引入的文件中配置 ssi 相关

    Options +Includes
    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
    
    • 上面的配置中,告诉 apache 解析所有后缀是 .shtml 的文件

    • 通常静态文件后缀为 html,可以修改配置中的 shtmlhtml,这样会导致 apache 发送文件到客户端前通读文件,即使里面没有 SSI 指令,影响页面加载速度

  • 另一种方法是,使用 XBitHack 指令,用到再来补充


Nginx 开启 SSI 支持

ssi 默认是关闭状态

# 启用 ssi,默认为 off
ssi on;

# on 时,在处理SSI文件出错时输出错误提示
ssi_silent_errors off;

# 默认是text/html,需要支持shtml则需要设置:ssi_types text/shtml
ssi_types text/html;

上面配置可以放在 http、server 或 location 作用域下


SSI 指令

最常见的引入一个共通页面

<!--#include virtual="/common/header.html" -->

<!--与 # 号间无空格

类似于 html 的注释,不会在页面显示。正确解析后会被解析后的内容替代


include

文件中包含另一个程序,被包含的文件可以是任意扩展名

# 文件名时相对路径,可以在同级或子目录,不能在上级目录
<!--#include file="sub.html" -->

# 虚拟目录,从根目录开始
<!--#include virtual="/cgi-bin/counter.pl" -->

flastmod

文件的修改日期

<!--#flastmod file="index.html" -->

fsize

文件大小

<!--#fsize file="index.html" -->

config

配置

# 设置时间格式
<!--#config timefmt="%A %B %d, %Y" -->

# 设置 SSI 指令发生错误时的提示信息
<!--#config errmsg="[It appears that you don't know how to use SSI]" -->

# 设置返回文件大小的格式(bytes、Kb、Mb)
<!--#config sizefmt="Kb" -->

echo

显示一个变量的值,可以是标准变量,也可以是 set 自定义的变量

# 显示当前日期
<!--#echo var="DATE_LOCAL" -->

# 文件修改时间
<!--#echo var="LAST_MODIFIED" -->

exec

用 shell(/bin/sh 或 DOS shell)来执行命令

也可以执行 cgi 脚本

# linux 中
<!--#exec cmd="ls" -->

# 执行 cgi 程序
<!--#exec cgi="/cgi-bin/command.cgi" -->

# windows 中
<!--#exec cmd="dir" -->

为了防止 SSI 注入,apache 中配置中可加入 Options IncludesNOEXEC 进行屏蔽 exec 指令


set

自定义变量

# 字面变量赋值
<!--#set var="env" value="PROD" -->

# 标准变量赋值,前面加 $
<!--#set var="modified" value="$LAST_MODIFIED" -->

# 多个标准变量或和字面变量混合时,用花括号隔开
<!--#set var="date" value="now ${DATE_LOCAL} modified ${LAST_MODIFIED}" -->

# 变量包含特殊字符要转义
<!--#set var="cost" value="\$100" -->

if elif else endif

条件语句,条件中可以用正则

<!--#if expr="1 = 1"-->
显示内容
<!--#elif expr="1 = 2"-->
显示内容
<!--#else-->
显示内容
<!--#endif"-->

SSI 注入漏洞及预防

只要服务器允许 ssi 指令,要严格控制用户输入验证,避免 ssi 注入。



SSI 指令中常见的日期时间格式

%a 一周七天的缩写形式 Thu
%A 一周七天 Thursday
%b 月的缩写形式 Apr
%B 月 April
%d 一个月内的第几天 13
%D mm/dd/yy日期格式 04/13/00
%H 小时(24小时制,从00到23) 01
%I 小时(12小时制,从00到11) 01
%j 一年内的第几天,从01到365 104
%m 一年内的第几个月,从01到12 04
%M 一小时内的第几分钟,从00到59 10
%p AM或PM AM
%r 12小时制的当地时间,格式为 01:10:18 AM
%I:%M:%S AM | PM
%S 一分钟内的第几秒,从00到59 18
%T 24小时制的%H:%M:%S时间格式 01:10:18
%U 一年内的第几个星期,从00到 15   52,以星期天作为每个星期的第一天
%w 一星期内的第一天,从0到6 4
%W 一年内的第几个星期,从00 15   到53,以星期一作为每个星期的第一天
%y 年的缩写形式,从00到99 00
%Y 用四位数字表示一年 2000
%Z 时区名称 MDT 

echo 可显示的环境变量

DOCUMENT_NAME:显示当前文档的名称
DOCUMENT_URI:显示当前文档的虚拟路径
QUERY_STRING_UNESCAPED:显示未经转义处理的由客户端发送的查询字串,其中所有的特殊字符前面都有转义符“\”
QUERY_STRING_UNESCAPED:显示未经转义处理的由客户端发送的查询字串,其中所有的特殊字符前面都有转义符“\”
DATE_GMT:功能与DATE_LOCAL一样,只不过返回的是以格林尼治标准时间为基准的日期
LAST_MODIFIED:显示当前文档的最后更新时间

可显示的 cgi 环境变量

SERVER_SOFTWARE:显示服务器软件的名称和版本
SERVER_NAME: 显示服务器的主机名称,DNS别名或IP地址
SERVER_PROTOCOL:显示客户端请求所使用的协议名称和版本,如HTTP/1.0
SERVER_PORT:显示服务器的响应端口
REQUEST_METHOD:显示客户端的文档请求方法,包括GET, HEAD, 和POST
REMOTE_HOST:显示发出请求信息的客户端主机名称
REMOTE_HOST:显示发出请求信息的客户端主机名称
AUTH_TYPE:显示用户身份的验证方法
REMOTE_USER:显示访问受保护页面的用户所使用的帐号名称
posted @ 2023-04-05 18:15  菜乌  阅读(292)  评论(0编辑  收藏  举报