Spring Boot 在请求正文中转义字符以实现 XSS 保护

2023-12-14

我正在尝试使用 XSSFilter 来保护我的 Spring Boot 应用程序,如下所示:

public class XSSFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException { }

    @Override
    public void destroy() { }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        chain.doFilter(new XSSRequestWrapper((HttpServletRequest) request), response);
    }

}

和包装纸:

public class XSSRequestWrapper extends HttpServletRequestWrapper {

    public XSSRequestWrapper(HttpServletRequest servletRequest) {
        super(servletRequest);
    }

    @Override
    public String[] getParameterValues(String parameter) {
        String[] values = super.getParameterValues(parameter);

        if (values == null) {
            return null;
        }

        int count = values.length;
        String[] encodedValues = new String[count];
        for (int i = 0; i < count; i++) {
            encodedValues[i] = replaceXSSCharacters((values[i]));
        }

        return encodedValues;
    }

    private String replaceXSSCharacters(String value) {
        if (value == null) {
            return null;
        }

        return value
                .replace("&","&#38;")
                .replace("<", "&#60;")
                .replace(">","&#62;")
                .replace("\"","&#34;")
                .replace("'","&#39;");
    }

    @Override
    public String getParameter(String parameter) {
        return replaceXSSCharacters(super.getParameter(parameter));
    }

    @Override
    public String getHeader(String name) {
        return replaceXSSCharacters(super.getHeader(name));
    }

}

问题是,这只保护请求参数和标头,而不是请求主体,有时我的控制器使用 @RequestBody 接收数据。

所以,如果我向我的控制器提交一个像这样的 json:

{"name":"<script>alert('hello!')</script>"}

name 属性中的 html 字符没有像我需要的那样被转义。我怎样才能逃脱RequestBody?

编辑: 这与“重复”问题不同。我的问题非常具体。如何转义请求正文中的字符。


要删除 XSS 字符,您只需重写 AbstractJackson2HttpMessageConverter - 此转换器负责将 request.inputStream 读取到 RequestBody 对象

@Component
public class XSSRequestBodyConverter extends AbstractJackson2HttpMessageConverter {
    public XSSRequestBodyConverter(ObjectMapper objectMapper) {
        super(objectMapper, MediaType.APPLICATION_JSON, new MediaType("application", "*+json"));
    }

@Override
public Object read(Type type, Class<?> contextClass, HttpInputMessage inputMessage)
        throws IOException, HttpMessageNotReadableException {

    Object requestBody = super.read(type, contextClass, inputMessage);
    //Remove xss from requestBody here
    String requestInStr = objectMapper.writeValueAsString(requestBody);
    return objectMapper.readValue(replaceXSSCharacters(requestInStr), Object.class);
}


}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot 在请求正文中转义字符以实现 XSS 保护 的相关文章

随机推荐

  • codeigniter 删除index.php表单url

    我正在尝试从 Codeigniter 中的 url 中删除 index php 我知道如何从基本网址中删除index php 如下所示example com controller 但我不知道如何删除子文件夹中的 index php exam
  • Angular - this.function 不是一个函数[重复]

    这个问题在这里已经有答案了 我对此有点绝望 我有一个组件 它获取数据并使用该数据的信息渲染地图 这里一切都很好 我在这张地图上放置了标记 我想在标记中执行单击功能 这些函数调用组件中定义的另一个函数 并为我带来数据以在模式中显示它 但是 当
  • JavaScript:操作两个数组

    我刚刚开始学习 JavaScript 并且不知道如何处理这个问题 问题是这样的 五个人 John Ed Sam Alex 和 Mark 年龄分别为 16 25 18 30 和 27 岁 我想使用数组和函数来输出五个中最年轻和最老的 我尝试形
  • 合并排序以计算 Python 中的拆分反转

    我正在尝试使用归并排序 我得到的 来计算列表中拆分反转的数量 也就是说 未排序列表前半部分中的元素应该出现在列表后半部分中给定元素之后 未排序列表 例如 3 2 1 4 将包含拆分反转 3 1 但不包含 3 2 因为 3 和 2 都在前半部
  • 如何在共享主机上设置 Mercurial 中央存储库

    我正在尝试设置一个具有共享托管的中央存储库 我从头到尾阅读了本教程https www mercurial scm org wiki PublishingRepositories无济于事 这是我采取的步骤 1 Copy hgwebdir cg
  • 通过将此 .NET 字符串更改为 const 是否会提高性能? IL 会自动执行此操作吗?

    给出以下简单的 NET 代码 这两者之间在字符串方面有什么区别吗 xml if extension Equals xml StringComparison OrdinalIgnoreCase return FileType Xml vs c
  • Java keytool 从 url/port 添加服务器证书的简单方法

    我有一个带有自签名证书的服务器 但也需要客户端证书身份验证 我在尝试获取原始 CA 服务器证书时遇到了困难 因此我可以将其导入密钥库 有人对如何轻松做到这一点有一些建议吗 正在研究如何在使用 jenkins cli 时信任证书 并发现htt
  • FOSRestBundle:ParamFetcher 错误

    我在我的项目中使用 FOSRestBundle 我已经配置了这条路由来访问不同的数据 Rest Get Rest QueryParam name categoriesId requirements 0 9a zA Z s default d
  • 来自私人 github 存储库的 npm 包,安装与更新 (package.json)

    我已经看到这个问题了npm install vs update 有什么区别 我的问题是关于使用安装与更新私人 github 存储库git urls 我有一个在 grunt 中使用的私人 github 存储库 该存储库经常更新 我使用安装了这
  • 正则表达式允许字母数字、最多一个空格等

    我正在打开这个线程 该线程与另一个线程非常相似 但我无法找出问题 我有一个输入字段 允许字母数字字符串与可选的唯一空格作为分隔符 然后是可选的其他字母数字字符串等 我找到这个正则表达式 0 9a zA z 有用 但是 当我在一个长句子中出现
  • 从 URL 展开特定的折叠式

    如果我使用地址 www xxxxxx com test html chgd 第二个手风琴应该展开 我使用了这个网站的源代码 Bootstrap 3从URL扩展手风琴 但它在这种情况下不起作用 我不知道基于源代码来扩展第二个基于URL的手风琴
  • 将时间浮点转换为 HH:mm sql server 格式

    我需要将浮点十进制数格式化为时间格式小时 分钟 我用输入 float 和输出 varchar 6 编写了这个标量值函数 CREATE FUNCTIONE formatOre input float returns varchar 6 as
  • 类型错误:在字符串格式化过程中并非所有参数都被转换元组 python 中的错误

    我试图在数据库中保存一堆元组 cursor cnx cursor query INSERT INTO TableA clientid createddatetime siteid VALUES cursor executemany quer
  • 套接字多线程 - 读取输入流暂停线程

    我正在本地机器上测试套接字 我正在尝试使用线程在一个程序中运行套接字和服务器 我的服务器是一个回显服务器 因此它会发回收到的任何消息 我的问题是 当我在客户端和服务器上启动两个线程时 当它们到达我从输入流读取的部分时 它们会 冻结 它在客户
  • 无法发布错误 React js

    我收到一个有错误的空白页无法发布 注册 第二步 我正在尝试创建多步骤注册 我的主要组件的渲染函数如下 render const languageReg this props currentLanguage default registrat
  • mailto 不可读的字符 - unicode

    我在网站中使用 mailto URI 方案通过电子邮件发送当前页面 问题是我使用印地语作为 mailto 链接的主题 Example a href Testing a 单击链接时 Outlook 版本 6 将打开 并显示一些不可读的字符作为
  • 如何使用 PhoneGap 将图像保存到 iPhone 照片库?

    我正在为 iPhone 创建一个 PhoneGap 应用程序 用于显示图像库 有些图像包含在项目安装中 有些来自网络 当用户单击图像时 我希望他们能够将图像保存到 iPhone 照片库 照片 最初 我希望该应用程序能够让用户将图像设置为壁纸
  • 如何删除 DOM 元素标签但保留其内容?

    我有 PHP 代码 它删除至少具有一个属性的所有节点 Here是我的代码
  • 为什么可以通过使用指向对象成员的指针的 const 成员函数来修改对象状态?

    为什么此代码不会产生编译器错误 class C int i 123 int ptr i public int i const return ptr int main C const c c i 321 return c i 标准中有关于这种
  • Spring Boot 在请求正文中转义字符以实现 XSS 保护

    我正在尝试使用 XSSFilter 来保护我的 Spring Boot 应用程序 如下所示 public class XSSFilter implements Filter Override public void init FilterC