当遇到非法 URL 参数时,如何保障网页正常打开

简介: 访问如`http://example.com?a@b=1`的链接出现400 Bad Request错误,这是因为Tomcat不允许请求目标中含有非法字符。Spring Boot 2可通过配置`server.tomcat.relaxed-query-chars`来允许特殊字符,但这样做可能引入安全风险。因此,建议在Nginx层使用`rewrite_by_lua_block`和`ngx.redirect`进行重定向,将非法字符替换为合法形式,如`http://example.com?ab=1`,同时记录日志以监控。此方案能避免直接修改后端代码,提高安全性。

前几天遇到个 case :别人在组装我们的 url 的时候对一些自定义参数没有进行 urlencode 导致打开的时候页面直接 400。比如:http://example.com?a{b=1 正常应该是 http://example.com?a%7Bb=1

后端 tomcat 会报错:

Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

访问这个地址 400 其实也符合预期

400 Bad Request:
这是最常用的状态码来表示请求中有语法错误,不能被服务器理解。如果请求的URL格式不正确或包含非法字符,返回 400 状态码是适当的。客户端发送了一个包含非法字符的请求,服务器无法处理这个请求,应该返回 400 Bad Request。

第一时间是想谁拼接的参数啊,这么坑爹,害得我老板找我茬。我顺手打开了百度等网站,发现他们都对参数做了兼容,看来老板的要求也非无理要求,作为后端兜底,还是得研究下如何处理了。

后端是springboot内嵌的tomcat,url 非法的拦截是发生在tomcat,貌似 tomcat 可以对非法字符进行加白处理。在Spring Boot 2中,可以通过application.properties来设置relaxedQueryChars属性,从而允许在查询参数中使用特殊字符。(application.yml同理)

server.tomcat.relaxed-query-chars=[]{
   },^@

ai 提示:当你放宽Tomcat对特殊字符的限制时,请确保你的应用程序能够安全地处理这些字符。务必仔细考虑SQL注入、跨站脚本(XSS)等潜在的安全风险,并采取相应的防护措施。
如果可能的话,最好还是避免在URL中使用这些特殊字符,特别是在可以通过其他方式(例如,通过HTTP头或请求体)传递同样信息的情况下。

所以想要不还是在 nginx 这层做个重定向吧,以实现 http://example.com?a@b=1 -> http://example.com?ab=1 的跳转。这样就还是得依赖 openresty 的 lua 模块来实现。

rewrite_by_lua_block 在 Nginx 的 rewrite 阶段执行,这是处理请求并决定请求如何响应的早期阶段。它常用于修改请求URI、查询字符串、请求头部或者做内部跳转。可以在这个阶段使用 ngx.redirect 来进行外部重定向。所以尝试这样去做 nginx 反向代理 springboot

location / {
   
    rewrite_by_lua_block {
   
        local query_string = ngx.var.query_string
        if query_string then
            local new_query_string = ngx.re.gsub(query_string, "[\\[\\]|{}^`@]", "", "ijo")
            if new_query_string ~= query_string then
                ngx.log(ngx.WARN, "query_replace:" .. query_string .. " -> " .. new_query_string)
                local new_uri = "https://" .. ngx.var.host .. ngx.var.uri .. "?" .. new_query_string
                ngx.redirect(new_uri, ngx.HTTP_MOVED_PERMANENTLY)
            end
        end
    }

    proxy_pass http://127.0.0.1:7001;
}

如果确定命中了需要跳转的情况,则打印一行warn日志,用于我上线之后的抽查,检查有错误。选择第二个方案呢,就是想避免一些没想到的安全漏洞,而直接是直接重定向。

2024/04/19 13:41:01 [warn] 4493#4493: *4828077 [lua] rewrite_by_lua(nginx-proxy.conf:127):6: query_replace:pageNum=2] -> pageNum=2, client: 11.22.57.33, server: example.com, request: "GET /tag/100274?pageNum=2] HTTP/1.1", host: "example.com"

test

目录
相关文章
|
3月前
|
网络协议 前端开发 JavaScript
浏览器加载网页的幕后之旅:从URL到页面展示详解
【8月更文挑战第31天】当在浏览器地址栏输入URL并回车后,一系列复杂过程随即启动,包括DNS解析、TCP连接建立、HTTP请求发送、服务器请求处理及响应返回,最后是浏览器页面渲染。这一流程涉及网络通信、服务器处理和客户端渲染等多个环节。通过示例代码,本文详细解释了每个步骤,帮助读者深入理解Web应用程序的工作机制,从而在开发过程中作出更优决策。
65 5
|
2月前
|
前端开发 JavaScript
前端JS截取url上的参数
文章介绍了两种前端JS获取URL参数的方法:手动截取封装和使用URLSearchParams。
53 0
|
3月前
|
开发框架 前端开发 .NET
Asp.net Webapi 的 Post 方法不能把参数加到 URL 中?试试这样写
Asp.net Webapi 的 Post 方法不能把参数加到 URL 中?试试这样写
|
3月前
|
Java
JAVA 获取 URL 指定参数的值
JAVA 获取 URL 指定参数的值
48 0
|
5月前
|
Java 机器人 API
JAVA实现自动打开URL对应的网页并保存为图片-不借助第三方API
JAVA实现自动打开URL对应的网页并保存为图片-不借助第三方API
48 9
|
4月前
|
算法
「AIGC」readLink实现url识别pdf、网页标题和内容
AIGC算法实现服务,通过Express接收URL,识别内容类型:HTML使用Cheerio解析,PDF用`pdf-parse`。自定义函数提取标题和内容。示例代码展示了如何处理HTTP响应,提取HTML的`<title>`及PDF文本,并提供错误处理。服务器运行在端口3000。
48 0
|
4月前
|
JavaScript 前端开发 数据格式
URL编码【详解】——Javascript对URL进行编码解码的三种方式的区别和使用场景,axios请求拦截器中对get请求的参数全部进行URL编码
URL编码【详解】——Javascript对URL进行编码解码的三种方式的区别和使用场景,axios请求拦截器中对get请求的参数全部进行URL编码
256 0
|
4月前
|
JavaScript
js 获取并解析 url 中参数的三种方法
js 获取并解析 url 中参数的三种方法
469 0
|
5月前
|
文字识别 算法 API
视觉智能开放平台产品使用合集之在调用接口传入的图片URL参数,文件在本地或者非上海地域OSS链接,该怎么办
视觉智能开放平台是指提供一系列基于视觉识别技术的API和服务的平台,这些服务通常包括图像识别、人脸识别、物体检测、文字识别、场景理解等。企业或开发者可以通过调用这些API,快速将视觉智能功能集成到自己的应用或服务中,而无需从零开始研发相关算法和技术。以下是一些常见的视觉智能开放平台产品及其应用场景的概览。
|
5月前
|
Web App开发 移动开发 安全
如何做到修改 url 参数页面不刷新
如何做到修改 url 参数页面不刷新