如何配置Apache仅记录.MyAuth Cookie值或拦截含无效分隔符的Cookie请求
Apache默认只认分号作为Cookie的分隔符,遇到逗号时,{.MyAuth}C会直接把从.MyAuth=开始到请求头末尾的内容全捞出来。要精准提取值,得先通过mod_rewrite把目标值存到环境变量,再记录这个变量:
- 先启用mod_rewrite(没开的话执行命令):
a2enmod rewrite systemctl restart apache2
- 在你的VirtualHost配置里加规则提取.MyAuth的值:
RewriteEngine On RewriteCond %{HTTP_COOKIE} ^.*\.MyAuth=([^,;]+).*$ RewriteRule ^ - [E=MY_AUTH:%1]
正则会匹配.MyAuth=后面到逗号或分号之前的内容,存到环境变量MY_AUTH里。
- 修改日志格式,记录这个环境变量:
LogFormat "%{MY_AUTH}e" minulogi CustomLog ${APACHE_LOG_DIR}/access.log minulogi
这样日志里就只会输出.MyAuth的纯值,不会带上后面的Company=165。
解决方案二:拦截用无效分隔符的请求
可以选Apache或ASP.NET MVC两种方式拦截:
用Apache拦截
通过mod_rewrite检查Cookie头里的逗号(标准分隔符是分号),直接返回400错误:
RewriteEngine On RewriteCond %{HTTP_COOKIE} , RewriteRule ^ - [R=400,L]
只要Cookie头带逗号,就返回400 Bad Request。
用ASP.NET 9 MVC拦截
加个全局过滤器,检查Cookie头格式:
public class InvalidCookieFilter : IActionFilter { public void OnActionExecuting(ActionExecutingContext context) { var cookieHeader = context.HttpContext.Request.Headers["Cookie"].ToString(); // 排除Cookie值本身带引号包含逗号的合法情况,只拦截用逗号分隔Cookie的情况 if (cookieHeader.Contains(",") && !cookieHeader.Contains("=\"") && !cookieHeader.EndsWith("\"")) { context.Result = new BadRequestObjectResult("Cookie分隔符错误:请用分号替代逗号"); } } public void OnActionExecuted(ActionExecutedContext context) { // 无需处理后续逻辑 } }
然后在Program.cs里注册这个过滤器:
builder.Services.AddControllersWithViews(options => { options.Filters.Add<InvalidCookieFilter>(); });
这样不符合标准格式的请求会直接被打回400。
内容的提问来源于stack exchange,提问作者Andrus
相关产品推荐
相关产品推荐

