2

我有一个指向可下载文件的链接的网页。例如:

http://www.mysite.com/download.php?FILE=downloads/programming/various/ebook.pdf

但它也可以有如下导航链接:

http://www.mysite.com/index.php

http://www.mysite.com/index.php?category=programming

http://www.mysite.com/index.php?section=programming&category=various

如何确定 URL 是否指向第一个链接中的文件?或者反过来,过滤掉不适合的 URL?

4

3 回答 3

2

带着你编辑的问题去:如果你想过滤掉文件,

筛选Content-Type标题。

这是常见 mime 类型的非正式列表

您可以检查响应标头以确定响应是否符合,例如,application/pdf 但您不能仅从 URL / URI 本身做出此决定。

事实上,我可以构建一个 Web 应用程序,它会使用 JPG 的 http://myapp.com/test.pdf标题和数据来响应 URL。Content-Type: image/jpeg

此外,我真的可以通过发送PDFContent-Type: image/jpeg的标题和数据来打破常规。


假设它不是故意破坏的(如上所述),那么您可以依赖响应。

请注意,如果内容本身偏离Content-Type标头,那么您可能会发生漏洞利用。这就是 iPhone 越狱的方式:通过处理格式错误的 PDF 数据。

于 2012-08-24T22:13:27.563 回答
1

寻找类似文件名的参数?

任何URL 都可以在请求时以文件响应。

在您请求之前,您无法知道 URL 会响应什么。

于 2012-08-24T22:13:56.800 回答
1

在 HTTP 中,URL 永远不会指向文件。它们识别资源,当您“取消引用”该 URL(即发出 GET 请求)时,您将获得一个表示。

用户代理是否选择将该表示存储为文件是它自己的选择。内容类型指导如何处理表示。

您可以使用HEAD请求获取内容类型。应该使用 PDF 文档,application/pdf但还有许多其他类型。默认情况下,大多数浏览器倾向于另存application/octet-stream为文件。(内容类型协商也有一些微妙之处。)

在 Java 中,您可以使用如下方式发出 HEAD 请求:

HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("HEAD");
// Check connection.getContentType();
于 2012-08-24T22:23:56.217 回答