如何防止java中的javascript注入
Posted
技术标签:
【中文标题】如何防止java中的javascript注入【英文标题】:how to prevent javascript injection in java 【发布时间】: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"
之前的所有文本都会被删除。
我怎样才能使最后一种情况更严格,避免上述问题?
【问题讨论】:
【参考方案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)而不是删除它?
以上是关于如何防止java中的javascript注入的主要内容,如果未能解决你的问题,请参考以下文章