You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

禁用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-originallow-scripts(但即使打开allow-scripts,也没法精准控制PDF内部的JS),而PDF阅读器需要依赖一些浏览器权限才能完整渲染,所以sandbox在这里不是合适的解决方案。

内容的提问来源于stack exchange,提问作者Krishna

火山引擎 最新活动