0

我正在尝试使用 python http.client 访问我的本地 TWiki 安装。出于某种原因,我总是以 403 Forbidden 告终。我可以访问服务器中的其他子文件夹,但不能访问 twiki。我可以用 curl 访问这个 TWiki 页面。使用 python http.client 访问 /bin/ 或 /cgi-bin/ 文件夹时有什么特别需要做的吗?

这是 twiki.org 页面的示例,因为我的 localhost 在外部无法访问:

>>> import httplib
>>> conn = httplib.HTTPConnection("twiki.org")
>>> conn.request("GET", "/cgi-bin/view/")
>>> r1 = conn.getresponse()
>>> print r1.status, r1.reason
403 Forbidden
>>> data1 = r1.read()
>>> data1
'<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">\n<html><head>\n<title>403 Forbidden</title>\n</head><body>\n<h1>Forbidden</h1>\n<p>You don\'t have permission to access /cgi-bin/view/\non this server.</p>\n<hr>\n<address>Apache/2.2.3 (CentOS) Server at twiki.org Port 80</address>\n</body></html>\n'
>>> 
4

1 回答 1

1

我自己试过这个,我发现设置User-Agent标题似乎可以解决它。标题是什么似乎并不重要,只是它被设置了:

>>> import httplib
>>> conn = httplib.HTTPConnection("twiki.org")
>>> conn.request("GET", "/cgi-bin/view/", headers={"User-Agent": "foo"})
>>> r1 = conn.getresponse()
>>> print r1.status, r1.reason
200 OK

不幸的是,我无法解释为什么 Twiki 返回没有User-Agent标头的 403 - 我只是尝试它,因为它是客户端之间可能存在的差异之一。我认为这类似于它试图决定是否返回网站的移动版本,但不优雅地处理没有标题的情况真的很糟糕。

但是,希望这至少为您提供了一种解决方法。

编辑

显然,这是他们默认 Apache 配置的一部分,使用该BrowserMatchNoCase指令设置环境变量blockAccess,该变量可能稍后被拾取以返回观察到的403 Forbidden响应。

他们似乎认为这可以以某种方式防止 DoS 攻击,尽管我真的不相信任何可以通过简单地设置随机User-Agent字符串来解决的问题。正如您从该配置中可以看出的那样,他们还有一个他们试图阻止的“已知不良”用户代理列表。您可以通过尝试使用其中一个从命令行获取来观察这一点:

$ GET -Ssed -H "User-Agent: some-random-name" http://twiki.org/cgi-bin/view/
GET http://twiki.org/cgi-bin/view/
200 OK
[...]
$ GET -Ssed -H "User-Agent: FAST" http://twiki.org/cgi-bin/view/
GET http://twiki.org/cgi-bin/view/
403 Forbidden
[...]

我确信他们这样做是有原因的,但我必须说我没有留下深刻的印象。

于 2013-05-27T23:02:43.090 回答