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
,可以修改配置中的shtml
为html
,这样会导致 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:显示访问受保护页面的用户所使用的帐号名称