我正在尝试加强后端服务器的安全性,nginx充当该后端服务器的反向代理,以抵抗XSS和HTML注入攻击。我希望能够简单地对任何包含'<'或'>'的请求做出400错误的响应,作为请求的一部分或查询字符串(例如,/ LookupPrice?name = <“ haarsy%0A> )。我尝试了以下操作(针对query_string),但请求仍通过:
if ($query_string ~* <){
return 400;
}
我需要做什么?
答案 0 :(得分:1)
请求URI是按百分比编码的,因此<>
通常被编码为%3C和%3E(尽管它们在RFC3986中未作为保留字符列出)。当构造标准化的URI变量$uri
时,Nginx会将字符解码为URI部分。但是查询字符串仍然按百分比编码。
要匹配查询字符串中的<
或>
,无论是否已百分比编码,请使用:
if ($query_string ~* (%3[CE]|[<>])) { return 400; }