如何传递查询参数而不在浏览器中显示它

How to pass a query parameter without displaying it in the browser

我是 BackboneJs 的新手,我需要一些帮助来使用 GET 和 Jersey 在 URL 中传递参数。

事实上,我有 table 份如下文件:

当我单击 PDF 图片时,它会使用 documentID 打开 PDF 文档。

前端(BackboneJs)

getDatas: function(e){
    var clickedEl = $(e.currentTarget);
    var id = clickedEl.attr("id");
    window.open(window.myApp.baseUrlService.defaultUrl + '/getDocument.json?an200_idDocument=' + id);
},

所以我得到了 documentId 并在后端使用它来打开文档。

背面 (JAVA)

@GET
@Path("/getDocument.json")
public Response getDocumentById(@QueryParam("an200_idDocument") String idDocument){
 // my code here
}

它工作得很好,但我的问题是当我打开文档时,我可以看到不安全的 documentId。我试过 @POST 但没用。

那么,还有其他解决办法吗?

遗憾的是,无法使用 GET 完全隐藏 URL 的参数,这实际上是 GET 和 POST 之间的要点之一。除非您加密这些数据以便使用 GET 或使用 POST 方法隐藏它们,否则您将没有其他解决方案。

他们之间的更多细节:https://www.w3schools.com/tags/ref_httpmethods.asp

浏览器中的任何内容都应该被认为已经受到威胁。

JS 中的任何加密都是毫无意义的,因为数据已经可供恶意方使用。

那么如何隐藏文档id呢?

数据不敏感

id 一般不是敏感信息。由于您已经将它们发送到前端以便用户能够请求特定文档,因此它们已经很容易获得。

考虑一下不要担心这些 ID。

使用 GUID

如果当前 ID 是一个可猜测的序列(1、2、3 等)并且用户未登录,这意味着 URL 可公开访问,请考虑在数据库中存储一个 GUID 以用于每个文档并使用它来识别它们。

/getDocument.json?an200_idDocument=123e4567-e89b-12d3-a456-426655440000

人们猜测 GUID 的可能性要小得多。

通过使用类别命名空间或用户 ID(如果用户已登录应用程序),使这些机会接近 none。

/getDocument.json?cat=bills&an200_idDocument=123e4567-e89b-12d3-a456-426655440000

按对象检查权限

如果用户已登录,请在 return 响应之前检查他是否可以从后端访问文档。如果他没有访问权限,return 一个 403 Forbidden 响应。

使用短期令牌

如果用户只能访问一次文档,请考虑短期令牌,它们是与用户或文档相关联的唯一字符串,它们会在 X 次或 X 次文档请求后过期。