【发布时间】:2019-05-05 19:40:51
【问题描述】:
我有一个 JSP 页面,当它被调用时会显示一个 PDF 文档。假设我以这种格式生成 URL:
http://localhost:8080/repository/file/view/viewPDF.jsp?fileID=27455
并将其发送给另一个用户。用户可以在他的浏览器上毫无问题地查看文档 (id:27455)。但是假设我想隐藏显示的 PDF 工具栏,因此不允许用户访问该工具栏。
我通过输入这个链接发现:
http://localhost:8080/repository/file/view/viewPDF.jsp?fileID=27455#toolbar=0
然后上面的这个将隐藏工具栏,但它很容易受到攻击,因为其他用户可以将它的值更改为 1 并且工具栏出现。我在想是否可以在后端代码内部隐藏它,但不知道如何。
我的视图PDF.jsp:
<%@page import="java.io.*"%>
<%@include file="../../../WEB-INF/jspf/mcre.jspf" %>
<%
response.setContentType("application/pdf");
boolean debug = true;
try {
String snodeid = request.getParameter("nodeID");
long nodeid = Long.parseLong(snodeid);
Pdfinfo pdf = PPFacade.getPDFInfo(nodeid);
String pdfpath = pdf.getFfullpath();
if (debug) {
System.out.println("=============== PDF STREAM ================");
System.out.println("pdfpath = "+ pdfpath);
}
//int len = (int)new File("D://test.pdf").length();
int len = (int)new File(pdfpath).length();
response.setContentLength(len);
byte[] buf = new byte[len];
FileInputStream pdfin = new FileInputStream(pdfpath);
pdfin.read(buf);
pdfin.close();
OutputStream pdfout = response.getOutputStream();
pdfout.write(buf,0,len);
pdfout.flush();
if (debug) {
System.out.println("=============== END PDF STREAM ================");
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
%>
<head>
PDF
</head>
当然,我知道隐藏#toolbar 并非万无一失,因为任何具有此类知识的用户都可以轻松绕过它。
【问题讨论】:
-
您为什么不总是隐藏工具栏并在新选项卡/窗口或 iframe 中显示 pdf?然后可以通过提供仅提供文档链接的“共享”按钮来共享链接。
-
它的工作方式是我生成一个如上所示格式的普通链接并将其发送给其他人。有人能够在浏览器上输入 URL 并查看它。就像那样。
-
另外,差点忘了,因为作为用户,我需要检查我是否有“权限”来打印和下载。如果是,则发送链接应允许工具栏=1,否则发送链接应允许工具栏=0。这就是我的逻辑。希望这是有道理的。
-
如果我正确理解了这个问题,一些基于某些标准的用户必须有权访问工具栏,而其他用户则不应该。因此,我会在后端进行检查,如果当前用户应该能够看到工具栏(例如登录),然后在 jsp 中传递此信息,则在 jsp 中,工具栏是否根据该信息显示或不显示。通过 url 执行检查似乎不是一个“干净”的解决方案。
-
@Dimitris 我相信你做对了。我的意思是这不是一个好的解决方案,我也想不出更好的解决方案,因为即使隐藏工具栏,我也可以轻松地在 url 上添加
toolbar=1,这会破坏目的,对吗?