禁用PDF内嵌JavaScript防XSS?ExtJs iframe加载PDF遇JS执行问题
解决PDF内嵌JavaScript导致的JS注入问题(ExtJS iframe场景)
针对你遇到的iframe加载带JS的PDF弹出alert、被判定为JS注入的问题,结合你试过sandbox和embed但显示异常的情况,这里有两个更可靠的方案:
方案1:利用PDF阅读器内置参数禁用JS(前端快速解决)
主流浏览器的PDF渲染器支持通过URL锚点参数直接禁用JavaScript执行,这个方法不会像sandbox那样限制PDF的正常渲染:
- Chrome/Edge/Chromium系浏览器:在PDF的URL末尾追加
#javascript=off - Internet Explorer:在URL末尾追加
#js=off
你可以直接修改ExtJS代码中iframe的src拼接逻辑,自动添加对应参数:
onResearchGridPanelDBItemClick: function(dataview, record, item, index, e, eOpts) { var pdf = record.get('path'); var title = Encoder.htmlDecode(record.get('title')); var pdfPanel = null; var pdfTab = null; var p = Ext.getCmp('ResearchPanel'); if(p){ pdfPanel = p; }else{ pdfPanel = Ext.create('sample',{ modal: true, border:false, resizable: false }); } console.log("RESEARCHCLICK: "+pdf+" launched by "+username); pdfPanel.show(); if(pdfPanel.getEl()){ // 根据浏览器类型添加禁用JS的锚点参数 var pdfUrl = contextPath+'/resources/research/'+pdf; var userAgent = navigator.userAgent; if (userAgent.indexOf("MSIE") !== -1 || userAgent.indexOf("Trident") !== -1) { // IE浏览器 pdfUrl += '#js=off'; } else { // Chrome/Edge等Chromium系浏览器 pdfUrl += '#javascript=off'; } pdfPanel.body.update('<b>'+title+'</b>'+ '<br><br>' + '<iframe style="height: 100%; width:100%; border: none" src="'+pdfUrl+'"></iframe>'); } },
这个方法的优势是不需要服务器端改动,快速生效,而且不会影响PDF的正常显示,完美避开sandbox的兼容性问题。
方案2:服务器端移除PDF中的JavaScript(彻底解决)
如果需要兼容所有浏览器,或者想从根源上消除PDF的JS风险,建议在服务器端对PDF进行预处理:
- 使用PDF处理库(比如Java的iText、.NET的iTextSharp、Python的PyPDF2)加载PDF文件
- 遍历并移除PDF中的所有JavaScript动作、脚本对象
- 将处理后的无JS版本返回给前端加载
这种方法最彻底,不管浏览器是什么配置,都不会有JS执行的可能,而且能避免前端参数被绕过的风险(虽然可能性极低)。
为什么不推荐sandbox?
你提到sandbox导致PDF显示不全,是因为sandbox默认会禁用很多浏览器特性,比如allow-same-origin、allow-scripts(但即使打开allow-scripts,也没法精准控制PDF内部的JS),而PDF阅读器需要依赖一些浏览器权限才能完整渲染,所以sandbox在这里不是合适的解决方案。
内容的提问来源于stack exchange,提问作者Krishna




