使用.NET Core

时间:2017-10-23 18:15:17

标签: javascript pdf .net-core

我从外部来源发送了PDF,希望用户能够通过网络服务查看。

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

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

我不需要保留任何JS功能,但我也希望保留尽可能多的PDF文件。

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

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

2 个答案:

答案 0 :(得分:0)

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

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

这项任务绝非易事。我建议您使用PDF库。

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

答案 1 :(得分:0)

下面的代码显示了如何使用XFINIUM.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解析和保存代码,否则在不使用第三方库的情况下无法实现此任务。

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