我用PHP编写了一个非恶意的、非垃圾邮件的IRC bot,使用了fsockopen
和相关函数。它可以工作。然而,问题是我需要支持代理(最好是SOCKS5,但如果HTTP更容易的话也可以,我怀疑)。fsockopen
不支持这一点。
我已经浏览了所有关于“PHP fsockopen proxy”的搜索结果和相关查询。我知道所有不起作用的东西,所以请不要链接到其中任何一个。
fsockopen的PHP手册页提到了函数stream_socket_client()
,
类似,但提供了更丰富的选项集,包括非阻塞连接和提供流上下文的能力。
一开始这听起来很有希望,应该允许我用stream_socket_client
替换fsockopen
调用并指定一个代理,也许是通过一个“流上下文”.
请注意,它必须是一个PHP代码的解决方案,我不能支付“代理”或使用任何其他外部软件“ Package ”这一点。
我尝试的所有方法似乎总是导致我从服务器得到一堆空输出,然后套接字被强制关闭。请注意,当我使用HexChat(一个普通的IRC客户端)时,我正在尝试的代理工作,在相同的网络中,所以这不是代理本身的错误。
2条答案
按热度按时间xlpyo6sf1#
据我所知,
fsockopen
或stream_socket_client
没有默认选项来设置SOCKS或HTTP代理(我们可以在HTTP选项中创建上下文并设置代理,但这不适用于stream_socket_client
)。然而,我们可以手动建立连接。连接到HTTP代理非常简单:
<!- -!>
字符串
这个函数返回一个文件指针资源,如果连接成功,否则返回一个文件指针资源。我们可以使用该资源与目标主机通信。
型
SOCKS 5代理的通信协议稍微复杂一些:
<!- -!>
更多详情:SOCKS Protocol Version 5.
型
此函数的工作方式与
connect_to_http_proxy
相同。虽然这两个函数都经过测试,但最好使用库;提供的代码主要用于教育目的。SSL支持和身份验证。
我们无法使用ssl://或tls://协议与
fsockopen
创建SSL连接,因为这将尝试与代理服务器(而不是目标主机)创建SSL连接。但是,在与代理服务器建立连接后,可以使用stream_socket_enable_crypto
启用SSL并与目标主机创建安全通信通道。这需要禁用对等验证,可以使用自定义上下文使用stream_socket_client
完成此操作。请注意,禁用对等验证可能会导致安全问题。对于HTTP代理,我们可以使用
Proxy-Authenticate
头添加身份验证。此头的值是身份验证类型,后跟用户名和密码,base64编码(基本身份验证)。对于SOCKS 5代理,身份验证过程再次变得更加复杂。似乎我们必须将身份验证代码从
0x00
(不需要身份验证)更改为0x02
(用户名/密码身份验证)。我不清楚如何使用身份验证值创建请求,因此无法提供示例。型
wztqucjr2#
下面是使用USERNAME/PASSWORD身份验证的SOCKS 5代理的示例
如果你想使用SOCKS 5进行身份验证,有两个文档可以帮助你:SOCKS5 Protocol和Username/Password Authentication for SOCKS
与之前示例的主要区别是在第一次请求期间使用方法X '02'而不是X '00',并在第一次请求之后发送用户名和密码。
字符串