1

我正在使用 webpy 制作一个小型网站。当我想使用 OAuth 时,发现防火墙会阻止对任何站点的 http 请求,我什至无法使用 IE 浏览互联网。

所以我要求管理员为我打开一些端口,但我不知道python或IE将使用哪些端口来发送http请求。

谢谢!

4

2 回答 2

8

我假设您正在谈论远程端口。在这种情况下,只需告诉管理员打开标准 Web 端口即可。真的,如果您的管理员不知道如何使 IE 能够通过防火墙工作,那么他就没有希望了。我建议走到街上随机的人面前说“80 和 443”,直到有人抬头,然后解雇你的管理员并雇用那个人;他不能更糟了。

如果您的管理员确实知道他在做什么,并且希望您使用 HTTP 代理而不是直接连接,请让他在 IE 中为您设置代理,查看他使用的设置,然后回到这里并搜索如何在 Python 中使用 HTTP 代理(对此有很多答案),如果遇到困难,请寻求帮助。

如果你在谈论本地端口,因为你有一个疯狂的防火墙,它们会从一些大范围内随机挑选出来。如果你想覆盖每一个常见的操作系统,你需要打开所有的1024-65535,虽然如果你只需要处理单个平台,大多数使用比这更小的范围,如果机器不会做除了运行你的程序之外,大多数人都有办法将其限制在更小的范围内(例如,Windows 上小至 255 个端口)。谷歌“临时端口”了解详情。

如果您需要限制本地端口,关键是在调用bind之前先调用您的套接字connect。如果您认为您在谈论本地端口,那么您可能错了。去问你的管理员(或你刚雇用的新管理员)并确定。但如果你是……</p>

如果您正在使用urllib/ urllib2,它没有任何方法可以做您想做的事,所以您不能再这样做了。您可以下拉到httplib,它可以让您传递source_address一个(host, port)元组,它将在连接之前用于绑定套接字。它并不像您使用的那么简单,但它比从头开始实现 HTTP 容易得多。

您可能还想查看requests,我知道它有自己的原生 OAuth支持,并且可能有一种指定源地址的方法。(我没看过,但我通常发现每当我想知道是否可以做 X时,它可以,并且requests以我想到的最明显的方式......)什么时候很乱,所以移植东西通常很容易。requestsurllib2urllib2urllib2

无论如何,无论您如何执行此操作,您都必须考虑一次只能将一个套接字绑定到同一个本地端口的事实。那么,如果两个程序同时运行,并且它们都需要建立出站连接,而您的管理员只给了您一个端口,会发生什么?其中之一将失败。这可以接受吗?

如果没有,您真正需要做的是打开一系列端口,并编写random.shuffle在该范围上执行 a 的代码,然后尝试bind它们直到成功。这意味着您将需要一个 HTTP 库,它可以让您输入套接字工厂或预先打开的套接字,而不是仅仅指定一个端口,其中大多数都没有,这可能意味着您将破解httplib资源。

如果一切都失败了,您始终可以设置一个本地代理,该代理在向外代理时绑定到您想要的任何源端口(或端口范围)。然后你可以直接使用你最喜欢的高级库,并连接到本地代理,防火墙无法知道代理背后发生了什么。

如您所见,这并不容易。这主要是因为您实际上很少这样做。

于 2012-12-10T10:13:58.293 回答
5

通常,当一个程序想要使用一个端口但不关心它有哪个数字时,它会使用一个“临时端口”。这是典型的客户端应用程序,其中远程端口是固定的(由服务器),但本地端口没有任何区别。

通常,防火墙将允许来自任何端口的传出连接,只是阻止与未知端口的传入连接,理论上应该允许发出传出请求的内部机器决定什么是正确的,并且不良行为者都在“公共”方面。

您可能会发现您的管理员要求您使用“HTTP 代理”。如果是这样,这里是我想你可以移植到 Python 的 Ruby 的说明:Ruby and Rails - oauth and http proxy

于 2012-12-10T10:12:31.830 回答