【问题标题】:Remove Javascript from PDF document using .NET Core使用 .NET Core 从 PDF 文档中删除 Javascript
【发布时间】:2017-10-23 18:15:16
【问题描述】:

我有从外部来源发送的 PDF,我希望用户能够通过 Web 服务查看。

PDF 是通过 .NET Core 服务检索的,该服务从数据库中获取它们并将它们输出为 PDF 文件。

问题在于恶意用户可以将 JS 放入 PDF 中。因为它们对浏览器来说似乎来自同一来源,所以 JS 可以对应用程序的其余部分执行 XSS 攻击。

我不需要保留任何 JS 功能,但我也希望尽可能多地保持 PDF 不变。

有没有办法使用 .NET Core 将 JS 从 PDF 中剥离出来并保持不变?

另外有什么方法可以指定在打开网页中嵌入的 PDF 文件时不执行任何 JS(例如使用<iframe src="file.pdf"<object type="application/pdf" data="file.pdf")。我不能依赖拥有额外 PDF 扩展名的用户,它需要使用 vanilla 浏览器。

【问题讨论】:

  • 您可以使用任何适当的通用PDF库来删除js。
  • @mkl 很酷,在答案中发布一个与 .NET Core 一起使用的功能示例,您可以得到一些代表。
  • 您选择哪个 .NET Core PDF 库?我不能推荐一个,因为 A 我还没有处理过 .NET Core,所以没有任何 PDF 库在那里正常工作的经验,并且 B 库推荐被关闭-这里的主题...
  • @mkl 啊,所以你认为我是在寻求产品推荐?因此,否决/关闭投票?虽然那里有很多 PDF 库,但大多数都与 .NET Core 不兼容,并且只有其中的一部分可以进行我所询问的更改。即便如此,这也不是微不足道的(暴露 PDF 文件格式的内部结构距离知道可以删除的内容还有很长的路要走)。我不是在问哪种方式是最好的,我是在问它是否实际上可能,如果它是如此简单以至于许多可能的库中的任何一个都可以做到,那么请随时提供一个库-不可知论者的答案。
  • Bobrovsky 和 ​​Mihai Iancu 的回答都解释了如何解决该任务,但正如您所见,他们都在此过程中宣传特定的库。所以是的,除了有效地帮助特定任务之外,您的问题是要求图书馆推荐,这反过来很可能引发反对票和关闭票。 (我也不是,我希望推动您宣布选择 PDF 库...;)

标签: javascript pdf .net-core


【解决方案1】:

要从 PDF 中删除所有 Javascript,您可以从删除所有共享 JavaScript 开始。这是一个特殊的文档级脚本集合。它通常用于定义可用于文档中其他脚本的 JavaScript 函数。

然后您可以找到文档中的所有操作并检查每个操作的类型。对于 Javascript 操作,您可以将关联代码替换为空字符串。

这项任务绝对不是一件容易的事。我建议您为此使用 PDF 库。

我的公司开发了Docotic.Pdf library,可以在 .NET Standard / .NET Core 中使用,可以帮助您完成任务。

【讨论】:

    【解决方案2】:

    以下代码显示了如何使用XFINIUM.PDF 库从 PDF 文件中删除 JavaScript 代码:

    public void RemoveDocumentJavascript(Stream inputStream, Stream outputStream)
    {
        PdfFixedDocument doc = new PdfFixedDocument(inputStream);
        // Remove document level JS code
        doc.JavaScriptBlocks.Clear();
    
        RemoveDocumentActions(doc);
    
        // Remove JavaScript from annotations.
        for (int i = 0; i < doc.Pages.Count; i++)
        {
            for (int j = 0; j < doc.Pages[i].Annotations.Count; j++)
            {
                RemoveAnnotationActions(doc.Pages[i].Annotations[j]);
            }
        }
    
        // Remove Javascript from fields
        for (int i = 0; i < doc.Form.Fields.Count; i++)
        {
            RemoveFieldActions(doc.Form.Fields[i]);
        }
    
        doc.Save(outputStream);
    }
    
    private void RemoveDocumentActions(PdfFixedDocument doc)
    {
        if (doc.OpenAction is PdfJavaScriptAction)
        {
            doc.OpenAction = null;
        }
        if (doc.BeforeCloseAction is PdfJavaScriptAction)
        {
            doc.BeforeCloseAction = null;
        }
        if (doc.BeforeSaveAction is PdfJavaScriptAction)
        {
            doc.BeforeSaveAction = null;
        }
        if (doc.AfterSaveAction is PdfJavaScriptAction)
        {
            doc.AfterSaveAction = null;
        }
        if (doc.BeforeSaveAction is PdfJavaScriptAction)
        {
            doc.BeforeSaveAction = null;
        }
        if (doc.AfterSaveAction is PdfJavaScriptAction)
        {
            doc.AfterSaveAction = null;
        }
        if (doc.BeforePrintAction is PdfJavaScriptAction)
        {
            doc.BeforePrintAction = null;
        }
        if (doc.AfterPrintAction is PdfJavaScriptAction)
        {
            doc.AfterPrintAction = null;
        }
    }
    
    private void RemoveAnnotationActions(PdfAnnotation annotation)
    {
        if (annotation.PageOpen is PdfJavaScriptAction)
        {
            annotation.PageOpen = null;
        }
        if (annotation.PageClose is PdfJavaScriptAction)
        {
            annotation.PageClose = null;
        }
        if (annotation.PageVisible is PdfJavaScriptAction)
        {
            annotation.PageVisible = null;
        }
        if (annotation.PageInvisible is PdfJavaScriptAction)
        {
            annotation.PageInvisible = null;
        }
        if (annotation.MouseDown is PdfJavaScriptAction)
        {
            annotation.MouseDown = null;
        }
        if (annotation.MouseUp is PdfJavaScriptAction)
        {
            annotation.MouseUp = null;
        }
        if (annotation.MouseEnter is PdfJavaScriptAction)
        {
            annotation.MouseEnter = null;
        }
        if (annotation.MouseLeave is PdfJavaScriptAction)
        {
            annotation.MouseLeave = null;
        }
        PdfLinkAnnotation link = annotation as PdfLinkAnnotation;
        if ((link != null) && (link.Action is PdfJavaScriptAction))
        {
            link.Action = null;
        }
    }
    
    private void RemoveFieldActions(PdfField field)
    {
        field.CalculateAction = null;
        field.FormatAction = null;
        field.KeyPressAction = null;
        field.ValidateAction = null;
    
        for (int i = 0; i < field.Widgets.Count; i++)
        {
            if (field.Widgets[i].Focus is PdfJavaScriptAction)
            {
                field.Widgets[i].Focus = null;
            }
            if (field.Widgets[i].Blur is PdfJavaScriptAction)
            {
                field.Widgets[i].Blur = null;
            }
        }
    }
    

    该库支持 .NET Core,可在 nuget.org 上获得(ID:xfinium.pdf.netcore)。
    除非您实现自己的 PDF 解析和保存代码,否则不使用 3rd 方库就无法实现此任务。

    免责声明:我为开发 XFINIUM.PDF 库的公司工作。

    【讨论】:

      猜你喜欢
      • 2018-06-13
      • 2023-01-05
      • 2013-04-30
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 2021-11-18
      相关资源
      最近更新 更多