我从外部来源发送了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浏览器。
答案 0 :(得分:0)
要从PDF中删除所有Javascript,您可以从删除所有共享JavaScript开始。这是一个特殊的文档级脚本集合。它通常用于定义可用于文档中其他脚本的JavaScript函数。
然后,您可以在文档中找到所有操作并检查每个操作的类型。对于Javascript操作,您可以使用空字符串替换关联的代码。
这项任务绝非易事。我建议您使用PDF库。
我的公司开发Docotic.Pdf library可以在.NET Standard / .NET Core中使用,可以帮助您完成任务。
答案 1 :(得分:0)
下面的代码显示了如何使用XFINIUM.PDF库从
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库的公司工作。