我一直在网上寻找一个PHP代理脚本,我找不到任何。我一直在寻找的脚本,下载页面和编辑src和href属性的HTML,并要求我浏览到任何网站的安装。我不需要这个,我需要一个真正的代理监听端口,我可以设置我的浏览器路由所有它的请求。
我想做的是:
我发现,所有用PHP编写的所谓代理脚本,如果请求的页面使用XMLHttpRequest来获取内容,都会失败,因为它们根本看不到这个请求。任何链接重写都不能解决这个问题,除非注入一些聪明的JavaScript,这对于一个真正的代理来说是不必要的。
最后,我想要的是能够访问在浏览器和远程服务器之间来回的请求和响应。我希望能够使用浏览器对JavaScript、cookies、flash等的支持。基本上,我希望能够编程访问所有的通信,这样我就可以使用PHP来分析或操作它。
所以,问题是
链接将不胜感激。我知道有几个MITM代理,但是我想在PHP中找到一个。
我不知道我是否可以用PHP内置的PHP服务器做点什么,但我也会搞砸的。
更新
我已经为内置在got服务器中的PHP提供了一个路由器脚本,它开始显示出希望。我可以启动web服务器并告诉我的web浏览器使用它作为代理。我所做的路由器脚本区分了本地资源和外部资源,并给出了一种处理这两种情况的简单方法。我唯一的问题是如何使用https。服务器报告Invalid Request (Malformed HTTP Request)。我认为这意味着这个服务器根本不会只使用脚本和设置就完成https。我不知道。也许我可以用Apache来完成它,但是透明地代理https听起来很难,特别是如果我想在数据到达浏览器之前修改它。
AtropaToolbox/php_router/router.php是我在webserver中构建的路由器脚本,它从其他文件中提取实际的类。
<?php
require_once('AtropaToolbox/php_proxy/proxy.php');
$proxy = new atropa_proxy();
if($proxy->process_request() === false) {
return false;
}
?>AtropaToolbox/php_proxy/proxy.php扩展了atropa_mod_proxy以重新定义处理程序。
<?php
require_once('AtropaToolbox/php_proxy/mod_proxy.php');
class atropa_proxy extends atropa_mod_proxy
{
protected function local_resource_handler() {
return false;
}
protected function external_resource_handler() {
$ext = $this->get_page();
//echo '<pre>' . print_r($ext, true) . '</pre>';
//$ext['page'] = preg_replace('/<a /', '<p ', $ext['page']);
$this->show_page($ext);
}
}
?>AtropaToolbox/php_proxy/mod_proxy.php通用路由器脚本
<?php
/**
* Rev. 1 Atropa mod_proxy for php built in webserver
*/
class atropa_mod_proxy
{
protected function is_external_resource() {
$host = parse_url($_SERVER['REQUEST_URI'], PHP_URL_HOST);
if(isset($host) && $host !== $_SERVER['SERVER_NAME']) {
return true;
} else {
return false;
}
}
protected function local_resource_handler() {
return false;
}
protected function external_resource_handler() {
$ext = $this->get_page();
$this->show_page($ext);
}
public function process_request() {
if($this->is_external_resource()) {
return $this->external_resource_handler();
} else {
return $this->local_resource_handler();
}
}
public function get_request_headers() {
$arr = array();
foreach($_SERVER as $svar => $sval) {
if(substr($svar, 0, 4) === 'HTTP') {
$svar = substr($svar, 5);
$svar = preg_replace('/_/', ' ', $svar);
$svar = ucwords(strtolower($svar));
$svar = preg_replace('/ /', '-', $svar);
$arr[$svar] = $sval;
}
}
return $arr;
}
public function pack_request_headers($headers_array) {
$packed = '';
foreach($headers_array as $header_name => $header_value) {
$packed .= $header_name . ': ' . $header_value . "\r\n";
}
return $packed;
}
public function echo_response_headers($http_response_header_array) {
foreach($http_response_header_array as $val) {
if(strpos(strtolower($val), 'connection') !== 0) {
header($val);
}
}
}
protected function get_page() {
$request_headers = $this->get_request_headers();
$request_headers = $this->pack_request_headers($request_headers);
$method = $_SERVER["REQUEST_METHOD"];
$scheme = parse_url($_SERVER['REQUEST_URI'], PHP_URL_SCHEME);
$opts = array(
$scheme => array(
'method' => $method,
'header' => $request_headers
)
);
if(count($_POST) > 0) {
$content = http_build_query($_POST);
$opts[$scheme]['content'] = $content;
}
$context = stream_context_create($opts);
$ext = array();
$ext['page'] = file_get_contents($_SERVER['REQUEST_URI'], false, $context);
$ext['http_response_header'] = $http_response_header;
return $ext;
}
protected function show_page($ext) {
header_remove();
$this->echo_response_headers($ext['http_response_header']);
echo $ext['page'];
}
}
?>发布于 2012-09-16 18:52:42
请在用PHP进行套接字编程和PHP套接字介绍上阅读。您将运行一个PHP守护进程,以使PHP侦听端口并处理所有请求。
为了做到这一点,您可能需要查看http://sourceforge.net/projects/poxy/,以便您可以将PHP建立在那里。您还必须了解代理如何与客户沟通。Poxy是一个基于web的应用程序,您输入一个URL,它会为您加载它.它不允许您侦听端口,它也不是php守护进程,因此您必须为PHP守护进程代理编写大量代码。
https://stackoverflow.com/questions/12449569
复制相似问题