跨域javascript表单填写,反向代理

时间:2010-09-14 14:37:46

标签: javascript forms cross-domain reverse-proxy

我需要一个javascript表单填充程序,它可以绕过大多数现代浏览器实现的“相同原始策略”。

我制作了一个脚本,可以在新的浏览器中打开所需的网站/表单。使用window.open方法返回的处理程序,我想使用WindowsHandler.document.getElementById('inputx')检索输入并填充它们(拒绝访问)。

是否可以通过在IIS 6中使用Isapi Rewrite(official site)作为反向代理来解决此问题? 如果是这样,我将如何配置反向代理?

这是我走了多远:

RewriteEngine on
RewriteLogLevel 9
LogLevel debug 

RewriteRule CarChecker https://the.actualcarchecker.com/CheckCar.aspx$1 [NC,P]

重写工作http://ourcompany.com/ourapplication/CarChecker,在日志记录中很明显。在我们的公司内部,我可以运行carchecker,就像它在我们自己的域中一样。除此之外,“同源政策”仍然有效。

更新

我停止使用Isapi Rewrite,因为免费版本不包含代理组件。我开始使用Managed Fusion中的url rewriter

我目前的工作重写:

RewriteRule /MySecuredSite/CarChecker https://the.actualcarchecker.com [NC,P]

现在我收到错误:底层连接已关闭:无法为SSL / TLS安全通道建立信任关系。

我认为这是因为我们的 ssl-certificate被传递到carchecker网站。如何配置反向代理以便传递carchecker站点的证书?

此致

米歇尔

3 个答案:

答案 0 :(得分:1)

在不知道更多细节的情况下,我认为列出您面临的一些限制以及您可以利用的一些技巧可能会有所帮助:

  1. 我不是ASP开发人员,但我知道,正如您所提到的,有某种viewstate变量必须与ASP表单一起提交。我假设可以仅使用要重新提交的表单字段来验证此视图状态。这就是我所期望的(除非它超级复杂),因为浏览器接收的形式是它发回的全部(以及值)。所以关键是当你提交到aspx页面时你需要一个有效的视图状态,但是你可以从服务器获取你想要的任何视图状态,只要你提交的表单字段是相同的。

  2. 您可以编写一个与您的浏览器一样的网页。它可以获取aspx页面(从而建立一个有效的视图状态),然后你可以创建POST到aspx页面所需的所有字段,包括viewstate,并且这样做。无论结果如何,都可以从您的网页返回到浏览器。除非你能够修改其他服务器,否则此时我真的看不到另一个选项,但也许其他人可能会更有帮助。

  3. 如果您可以修改其他服务器,那么您还有其他一些选项。其中一个涉及在iframe之间传递数据的技巧。如果您使用隐藏的iframe来获取aspx页面,那么由于跨域限制,您将无法将结果返回到父页面。但是既然你可以修改其他服务器(在.actualcarchecker.com上运行),你可以解决这个问题。为此,只需让服务器提供JavaScript以异步方式提交表单,然后将结果(序列化为字符串)设置为window.name。

    现在,要从您的域中访问window.name,您可以将iframe的window.location设置为域上的一个页面,该页面将简单地调用您在父窗口中加载的JavaScript中编写的函数。像window.parent.process(window.name)。由于iframe在您的域上加载了一个页面,因此它可以访问window.name,即使您更改了窗口位置,也不会更改该窗口。然后父窗口中的process()函数可以反序列化字符串,删除隐藏的iframe,显示结果,做任何你想做的事等等。

  4. 除非您在其他域的服务器上执行类似的操作,否则您将无法填充隐藏的iframe中加载的aspx表单。该服务器的JavaScript需要从window.name读取以接收用于填充表单的输入。但是,如果两个服务器都处于技巧状态,那么您不必编写代理,只需通过window.name传递数据。

答案 1 :(得分:0)

您使用的是哪种服务器端语言?使用它,您可以创建一个代理,它应该轻松绕过一个域策略......

<强> PHP

<?php
    $handle = fopen("https://the.actualcarchecker.com/CheckCar.aspx", "r");
    $contents = '';
    while (!feof($handle)) {
        $contents .= fread($handle, 8192);
    }
    fclose($handle);
    echo $contents;
?>

我想这将是与其他语言类似的过程。

答案 2 :(得分:0)

为什么不使用JSONP方法呢?即使用JavaScript读取输入到表单中的值,并通过动态生成的<script>元素将其发送到服务器端处理程序(<script>img元素可以引用外部域的资源)

var e = document.createElement("script");
e.setAttribute("type", "text/javascript");
e.setAttribute("src", "https://the.actualcarchecker.com/CheckCar.aspx?input1=value1&input2=value2");
document.getElementsByTagName('head')[0].appendChild(e); 

可能,如果您使用此方法,则根本不需要任何严重的URL重写 - 只需确保CheckCar.aspx返回有效的JSON。

JQuery甚至为此提供了几个便利功能:如果请求是跨域的,AFAIK $ .getJSON将透明地从XHR切换到动态脚本插入方法。此外,它还支持指定回调。有关详细信息,请参阅jQuery docsthis IBM文章。

这种方法适合你吗?