Jenkins Active Choice参数返回HTML丢失<script>标签如何解决
问题根因
你遇到的<script>标签和onchange属性被移除的问题,是Active Choice插件默认开启的HTML安全过滤机制导致的:为了防范XSS攻击,插件会用OWASP HTML清洗器过滤所有返回的HTML内容,默认会移除<script>标签、所有on开头的事件属性,以及其他存在安全风险的HTML元素和属性。
解决方法
方法1:关闭Active Choice的HTML清洗(适合内网安全可控的Jenkins环境)
- 进入Jenkins管理页面,依次打开「Manage Jenkins → Security → 全局安全配置」
- 找到「Active Choices Plugin」相关的配置段,取消勾选 Sanitize HTML generated for Active Choices HTML parameters 选项
- 保存配置后重新执行任务,你原来的代码里的script标签和onchange属性就不会被过滤了。
方法2:调整清洗规则保留指定标签和属性(更安全,适合公网暴露的Jenkins)
如果不想完全关闭安全过滤,可以自定义允许的HTML标签和属性白名单:
- 同样在全局安全配置的「Active Choices Plugin」配置段,找到自定义HTML白名单的输入框
- 加入以下规则,允许script标签和onchange属性:
script:src,type select:onchange
- 保存配置后即可生效。
额外注意:Jenkins内容安全策略(CSP)限制
如果调整上述配置后脚本仍然无法执行,需要检查Jenkins的CSP配置,默认的CSP规则会禁止内联脚本执行,可以临时调整CSP规则测试:
- 进入Jenkins脚本控制台(Manage Jenkins → Script Console)
- 执行以下代码临时修改CSP规则:
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline';")
如果需要永久生效,需要在Jenkins启动参数中加入上述系统属性配置。
调整后可正常运行的代码
你原来的代码只需要删除select标签style属性后多余的逗号即可:
if (!Settings.contains("ExtraDeployTargets")) { return ""; } html = """ <script> function Test(selectObject) { console.log("Hi"); } </script> <label style="font-size: 14px; font-weight: bold; display: inline;"> Choose number of additional instances: </label> <select name="value" style="height: 30px; font-size: 14px; display: inline-block;" onchange="Test(this)"> <option value="AdditionalInstancesCount=0">1</option> <option value="AdditionalInstancesCount=1">1</option> <option value="AdditionalInstancesCount=2">2</option> <option value="AdditionalInstancesCount=3">3</option> <option value="AdditionalInstancesCount=4">4</option> <option value="AdditionalInstancesCount=5">5</option> </select> """ return html;
内容的提问来源于stack exchange,提问作者Vladyslav Lishchyna
相关产品推荐
相关产品推荐

