【问题标题】:how to prevent javascript injection in java如何防止java中的javascript注入
【发布时间】:2017-05-19 04:11:14
【问题描述】:

我有一个富文本区域,用户可以在其中输入内容。我正在尝试使用以下正则表达式来防止 JavaScript 注入:

return input == null ? null : input.replaceAll("(?i)<script.*?>.*?</script.*?>", "") // case 1
            .replaceAll("(?i)<.*?javascript:.*?>.*?</.*?>", "") // case 2
            .replaceAll("(?i)<.*?\\s+on.*?>.*?</.*?>", ""); // case 3

上面,input 是来自富文本区域的文本,我正在使用这个正则表达式来避免可能的 JavaScript 注入。

问题是案例3。如果用户的文本包含"on",则"on"之前的所有文本都会被删除。

我怎样才能使最后一种情况更严格,避免上述问题?

【问题讨论】:

    标签: javascript java javascript-injection


    【解决方案1】:

    如果你想删除 "on" 和标签末尾的所有内容,你可以使用这个: .replaceAll("(?i)(<.>?\s+)on.?(>.*?)", "$1$2");

    这会将“ACD”呈现为“ACD”。但是请注意,如果有人在脚本中放置了一个“>”字符,它会弄乱正则表达式...

    编辑:我的评论的寓意是我不建议使用自定义解析来删除 javascript 代码。我建议您熟悉以下问题的答案:Java: Best way to remove Javascript from HTML 并可能使用 Jsoup.clean(如果在您的环境中可能的话)。

    【讨论】:

    • JSoup 从 HTML 中删除属性。它是否也适用于纯文本。示例:它确实适用于“我喜欢这个网站,因为 教会了我很多东西”
    • 它只接受文本......但它可能会做一些你不想要的事情:它完全删除了 标签(它不应该在文本中)并添加了一个换行符当我用

      尝试它时。您是否考虑过转义 html(包括 javascript)而不是删除它?

    猜你喜欢
    • 1970-01-01
    • 2016-08-31
    • 2012-04-28
    • 2014-08-20
    • 2011-04-12
    • 2020-12-15
    • 2010-10-26
    • 2015-09-07
    • 2021-03-13
    相关资源
    最近更新 更多