Stefan Welscher: Zeichenkette in gesamtem "Quelltext" ersetzen

Moin moin,
folgendes Problem beschäftigt mich gerade:
Ich habe von der Firma einen SSH-Zugang zur Fernwartung eines Servers bekommen. Da ich über den Zugang tatsächlich nur SSH drüber bekomme möchte ich eine Möglichkeit haben, das HTTP-Webinterface über SSH zu tunneln.

Ich habe mein Putty dafür so eingerichtet, dass es alle Pakete, die localhost auf Port 80 bekommt auf die SSH-Session schiebt, soweit so gut. Wenn ich localhost im Browser eingebe komme ich jetzt auf die Startseite des Servers.
Ein Problem habe ich allerdings mit Webanwendungen wie phpMyAdmin, bei denen die Server-IP fest hinterlegt ist. Diese muss irgendwie doch localhost ersetzt werden. Eine kostenfreie NAT-Software für Windows 7 (mein Client) konnte ich bisher nicht finden, also habe ich mal versucht ein Greasemonkey-Script zu erstellen, welches die IP durch localhost ersetzt:

  
// ==UserScript==  
// @name         HTTP Tunnel Redirect-Script  
// @version      0.1  
// @namespace    *  
// @include	     http://localhost*  
// ==/UserScript==  
  
var replace_ip = '1.1.1.1';  
var replace_with = 'localhost';  
  
//Parse links  
var allLinks, thisLink;  
allLinks = document.evaluate(  
    '//a[@href] | //base[@href] | //link[@href]',  
    document,  
    null,  
    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,  
    null);  
	  
for (var i = 0; i < allLinks.snapshotLength; i++)  
{  
		thisLink = allLinks.snapshotItem(i);  
		if (thisLink.href.match(replace_ip))  
		{	thisLink.href = thisLink.href.replace(replace_ip, replace_with); }  
}  
  
//Parse images  
var allImgs, thisImg;  
allImgs = document.evaluate(  
    '//img',  
    document,  
    null,  
    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,  
    null);  
  
for (var i = 0; i < allImgs.snapshotLength; i++)  
{  
		thisImg = allImgs.snapshotItem(i);  
		if (thisImg.src.match(replace_ip))  
		{	thisImg.src = thisImg.src.replace(replace_ip, replace_with); }  
}  
  
//Parse forms  
var allImgs, thisImg;  
allImgs = document.evaluate(  
    '//form[@action]',  
    document,  
    null,  
    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,  
    null);  
  
for (var i = 0; i < allImgs.snapshotLength; i++)  
{  
		thisImg = allImgs.snapshotItem(i);  
		if (thisImg.action.match(replace_ip))  
		{	thisImg.action = thisImg.action.replace(replace_ip, replace_with); }  
}  

Im großen und ganzen läuft das schon, aber an einigen Stellen ist die IP noch in JavaScript-Redirects oder ähnlichem hinterlegt und es kommt noch zu Fehlern. Gibt es eine Möglichkeit Suchen und Ersetzen über die gesamte Website durchzuführen um wirklich jeden Eintrag zu erschlagen, oder wie könnte ich die JS-Sachen mit erschlagen?

Danke schonmal!

  1. Hallo,

    jup, suchen und ersetzen über die gesamte Seite geht.

      
    var htmlElement = document.documentElement;  
    htmlElement.innerHTML = htmlElement.innerHTML.replace(/alteAddresseRegex/, 'neueAdress');  
    
    

    Das Problem hierbei ist nur das alle per JavaScript hinzugefügten Eventhandler verloren gehen und beim Setzen von innerHTML alle enthaltenen Scripte aus Sicherheitsgründen nicht ausgeführt werden. So könntest du dein Problem also nicht lösen.

    Wenn du deinen Ansatz weiter verfolgen willst, dann müsstest du noch per src-Attribut eingebundene Scripte berücksichtigen. Wenn aber ein Inline-Script das eingebundene Script benötigt, muss die Reihenfolge der Ausführung beachtet werden.

    Anstatt im JavaScript-Code URLs auszutauschen, könntest du versuchen, die URLs abzufangen z.B. in XMLHttpRequest.prototype.open. Dies ginge noch relativ einfach. Schwieriger wirds, wenn du keine Funktion mehr ersetzen musst, sondern eine Property wie z.B. window.location.href. Soweit ich weiß, wäre es mittels Object.defineProperty aus EcmaScript5 möglich, die URLs mit Settern umzubiegen, aber defineProperty wird im Moment im Firefox 3.6 nicht unterstützt.

    Dieser Ansatz kann bei einfachen Webseiten gut funktionieren. Mit deiner Idee, im Quelltext einfach die Adresse zu ersetzen kommst du bestimmt weiter. Es wäre vielleicht möglich, alle Script-Tags durchzugehen und im Inhalt etwas zu verändern, aber dazu müsste man das machen bevor irgendeiner dieses Scripte ausgeführt wird und ich wüsste nicht, wie das gehen soll. Ich denke nicht, dass JavaScript und DOM der richtige Weg sind, um dein Problem zu lösen. Der beste Weg wäre meiner Meinung nach, beim Tunneln irgendein Programm zwischenzuschalten, das die Ersetzungen vornimmt. Doch mit Tunneln und so kenne ich mich leider nicht aus.

    Schöne Grüße
    Tim

    Moin moin,
    folgendes Problem beschäftigt mich gerade:
    Ich habe von der Firma einen SSH-Zugang zur Fernwartung eines Servers bekommen. Da ich über den Zugang tatsächlich nur SSH drüber bekomme möchte ich eine Möglichkeit haben, das HTTP-Webinterface über SSH zu tunneln.

    Ich habe mein Putty dafür so eingerichtet, dass es alle Pakete, die localhost auf Port 80 bekommt auf die SSH-Session schiebt, soweit so gut. Wenn ich localhost im Browser eingebe komme ich jetzt auf die Startseite des Servers.
    Ein Problem habe ich allerdings mit Webanwendungen wie phpMyAdmin, bei denen die Server-IP fest hinterlegt ist. Diese muss irgendwie doch localhost ersetzt werden. Eine kostenfreie NAT-Software für Windows 7 (mein Client) konnte ich bisher nicht finden, also habe ich mal versucht ein Greasemonkey-Script zu erstellen, welches die IP durch localhost ersetzt:

    // ==UserScript==
    // @name         HTTP Tunnel Redirect-Script
    // @version      0.1
    // @namespace    *
    // @include      http://localhost*
    // ==/UserScript==

    var replace_ip = '1.1.1.1';
    var replace_with = 'localhost';

    //Parse links
    var allLinks, thisLink;
    allLinks = document.evaluate(
        '//a[@href] | //base[@href] | //link[@href]',
        document,
        null,
        XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
        null);

    for (var i = 0; i < allLinks.snapshotLength; i++)
    {
    thisLink = allLinks.snapshotItem(i);
    if (thisLink.href.match(replace_ip))
    { thisLink.href = thisLink.href.replace(replace_ip, replace_with); }
    }

    //Parse images
    var allImgs, thisImg;
    allImgs = document.evaluate(
        '//img',
        document,
        null,
        XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
        null);

    for (var i = 0; i < allImgs.snapshotLength; i++)
    {
    thisImg = allImgs.snapshotItem(i);
    if (thisImg.src.match(replace_ip))
    { thisImg.src = thisImg.src.replace(replace_ip, replace_with); }
    }

    //Parse forms
    var allImgs, thisImg;
    allImgs = document.evaluate(
        '//form[@action]',
        document,
        null,
        XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
        null);

    for (var i = 0; i < allImgs.snapshotLength; i++)
    {
    thisImg = allImgs.snapshotItem(i);
    if (thisImg.action.match(replace_ip))
    { thisImg.action = thisImg.action.replace(replace_ip, replace_with); }
    }

    
    >   
    > Im großen und ganzen läuft das schon, aber an einigen Stellen ist die IP noch in JavaScript-Redirects oder ähnlichem hinterlegt und es kommt noch zu Fehlern. Gibt es eine Möglichkeit Suchen und Ersetzen über die gesamte Website durchzuführen um wirklich jeden Eintrag zu erschlagen, oder wie könnte ich die JS-Sachen mit erschlagen?  
    >   
    > Danke schonmal!
    
    1. Moin!

      Ein lokaler Proxy koennte das Problem evtl. loesen. Der kann dezent alle Vorkommen irgendwelcher Werte mit anderen ersetzen.

      --
      Ich bin dafuer verantwortlich was ich sage, nicht dafuer, was Du verstehst.