我正在寻找一种方法来使规则的msg信息(已触发哪条规则)出现在错误和/或审核日志文件中,并在响应头中发送回客户端。 我知道有阶段“msg”,但它没有在响应头中发送回客户端的信息,所以它对我没有帮助。 我想在html的错误页面中看到日志的信息,我该怎么办? 谢谢你的帮助, Vladi。
答案 0 :(得分:2)
让客户知道到底出了什么问题是个坏主意。黑客可以使用它来解决您的安全框架。更好的方法是mod_unique_id
和自定义错误页面的组合。要遵循的步骤:
mod_unique_id
ErrorDocument 403 /<url_path_to>/403.php
)以下是403错误页面的示例,我们称之为403.php
(不,纯静态页面不起作用):
<?php
$protocol = $_SERVER['SERVER_PROTOCOL'];
header("$protocol 403 Forbidden");
header("Status: 403 Forbidden");
header("Connection: close");
$msg = $_SERVER["UNIQUE_ID"];
?>
<HTML><HEAD>
<TITLE>You have no access to this resource (403)</TITLE>
</HEAD><BODY>
<P>An error occured. Please tell the admin the error code: <?php echo $msg; ?></P>
</BODY></HTML>
这只是一个非常缩写的变体,没有样式等(你可能想要增强它),但我顺便让它变得简单易懂。 $msg
将打印一个唯一代码。客户端可以告诉您这段代码,您可以使用它来查找错误日志中的确切行,您将在哪里查看触发它的规则等。
答案 1 :(得分:0)
如果您不想使用外部内容(mod_perl、mod_php 等),因为例如您在前端反向代理上并且不想暴露更大的攻击面,则可以使用 SSI (Server Side Include),因为 apache 在内部通过 mod_include 支持 SSI。
只需加载 mod_include,然后将其添加到您的虚拟主机:
# Custom 403 HTML error with base64 encoded date + uniqueid on response
<Directory /var/www/html/common/_Errors>
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
Options +Includes
</Directory>
ErrorDocument 403 /common/_Errors/403.shtml
<Location "/common/_Errors/403.shtml">
# don't block redirected error page due rule to correlation
SecRuleRemoveById 980130
</Location>
然后,创建一个包含如下内容的 HTML 文件 /var/www/html/common/_Errors/403.shtml:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>Your request was denied.</p>
<!--#config timefmt="%Y-%m-%d %H:%M:%S" -->
<p><pre><!--#set var="ERR" value="${DATE_LOCAL} - ${UNIQUE_ID}" --></pre></p>
<p><pre><!--#echo encoding="base64" var="ERR" --></pre></p>
</body></html>
如果您愿意,可以更改 #config timefmt 以适合您的日期时间格式。
mod_include 上的 SSI 将创建一个 HTML 响应,用 DATE_LOCAL 和 UNIQUE_ID 扩展 ERR 变量,并将输出编码为 base64 字符串。足以让我获得触发规则的 uniqueid 及其日期。