1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

PHP webproxy

  • flyingtable07
  • 28. August 2023 um 11:38
  • Unerledigt
  • flyingtable07
    18
    flyingtable07
    Mitglied
    Reaktionen
    59
    Punkte
    3.564
    Trophäen
    1
    Beiträge
    678
    • 28. August 2023 um 11:38
    • #1

    Hallo,
    Ich hab mal versucht einen PHP Webproxy zu bauen. Er soll alle Seiten über meine Domain darstelen können. die url der aufzurufenden seite soll über einen GET parameter übermittelt werden, anschließend werden alle weieren aufrufe von dieser ip an meine domain automatisch zu der domain der beim ersten aufruf übergebenen url geleitet. Leider stellt sich das ganze schwieirger als erwartet heraus, ich habe bereits eine funktion die alle domains / ip im content und in den headers replaced, bevor die seite zurückgeben wird, leider funktionieren seiten die cloudflare benutzen immer noch nicht. hat irgendjemand einen plan woran diese seiten erkennen, dass es sich um einen webproxy handelt?
    Das ist mein bsiheriger code:

    PHP
    <?php
    
    $ownDomain = "web.tilo-behnke.de";
    
    $servername = "db.meginder.de";
    $username = "searchEngine";
    $password = "SagIchNicht";
    $dbname = "searchEngine";
    
    $conn = new mysqli($servername, $username, $password, $dbname);
    
    if ($conn->connect_error) {
        echo "Verbindung fehlgeschlagen: " . $conn->connect_error;
    }
    
    function addIPUrl($ip, $url) {
        $data = [];
        if (file_exists('ip_urls.json')) {
            $data = json_decode(file_get_contents('ip_urls.json'), true);
        }
        $data[$ip] = $url;
        file_put_contents('ip_urls.json', json_encode($data, JSON_PRETTY_PRINT));
    }
    function getUrlForIP($ip) {
        if (file_exists('ip_urls.json')) {
            $data = json_decode(file_get_contents('ip_urls.json'), true);
            if (isset($data[$ip])) {
                return $data[$ip];
            }
        }
        return null;
    }
    function addIPGoal($ip, $url) {
        $data = [];
        if (file_exists('ip_goals.json')) {
            $data = json_decode(file_get_contents('ip_goals.json'), true);
        }
        $data[$ip] = $url;
        file_put_contents('ip_goal.json', json_encode($data, JSON_PRETTY_PRINT));
    }
    function getGoalForIP($ip) {
        if (file_exists('ip_goals.json')) {
            $data = json_decode(file_get_contents('ip_goals.json'), true);
            if (isset($data[$ip])) {
                return $data[$ip];
            }
        }
        return null;
    }
    
    $isGivenURL = isset($_GET['url']);
    $url = $_GET['url'] ?? null;
    
    if(!$url){
        $url = getUrlForIP($_SERVER['REMOTE_ADDR']);
    }
    if(!$url) $url = "https://example.com";
    addIPUrl($_SERVER['REMOTE_ADDR'], $url);
    
    $path = $_SERVER['REQUEST_URI'] ?? "";
    $domain = parse_url($url, PHP_URL_HOST);
    $url = "https://".$domain.$path;
    
    $localIP = $_SERVER['SERVER_ADDR'];
    $clientIP = $_SERVER['REMOTE_ADDR'];
    $goalIP = null;
    
    if(!$goalIP) $goalIP = getGoalForIP($clientIP);
    if(!$goalIP) $goalIP = gethostbynamel($domain)[0];
    
    if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST)) {
        $neuerEintrag = $conn->prepare("INSERT INTO post (url, json, ip) VALUES (?, ?, ?)");
        $json_encoded = json_encode(array("post" => $_POST, "get" => $_GET));
        $neuerEintrag->bind_param("sss", $url, $json_encoded, $_SERVER['REMOTE_ADDR']);
        $neuerEintrag->execute();
    }
    $conn->close();
    
    $allowedHeaders = array(
        "host"=>true,
        "connection"=>true,
        "cache-control"=>true,
        "sec-ch-ua"=>true,
        "sec-ch-ua-mobile"=>true,
        "sec-ch-ua-platform"=>true,
        "upgrade-insecure-requests"=>true,
        "user-agent"=>true,
        "accept"=>true,
        "accept-language"=>true
    );
    $blocked = "";
    
    $headers = getallheaders();
    $modifiedHeaders = [];
    foreach ($headers as $name => $value) {
        if($goalIP){
            $name = str_replace($localIP, $goalIP, $name);
            $value = str_replace($localIP, $goalIP, $value);
        }
    
        $name = str_replace($clientIP, $localIP, $name);
        $value = str_replace($clientIP, $localIP, $value);
    
        $name = str_replace($ownDomain, $domain, $name);
        $value = str_replace($ownDomain, $domain, $value);
    
        if(!isset($allowedHeaders[strtolower($name)])){
            $blocked .= $name."; ";
            continue;
        }
    
        if ($name === 'Host') {
            $modifiedHeaders[] = "Host: $domain";
        } else {
            $modifiedHeaders[] = "$name: $value";
        }
    }
    
    $cookies = [];
    foreach ($_COOKIE as $cookieName => $cookieValue) {
        $cookieName = str_replace($ownDomain, $domain, $cookieName);
        $cookieValue = str_replace($ownDomain, $domain, $cookieValue);
        $cookies[] = "$cookieName=$cookieValue";
    }
    
    $cookieHeader = "Cookie: " . implode('; ', $cookies);
    $modifiedHeaders[] = $cookieHeader;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $modifiedHeaders);
    
    if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST)) {
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($_POST));
    }
    
    $response = curl_exec($ch);
    $headers = curl_getinfo($ch);
    
    curl_close($ch);
    
    $content = $response;
    
    function replaceURLs($content, $ownDomain) {
        return preg_replace_callback(
            '/(https?:\/\/[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}(?:\/[^\s]*)?)/',
            function ($matches) use ($ownDomain) {
                $url = $matches[1];
                $parsed_url = parse_url($url);
    
                if ($parsed_url === false) {
                    return $url;
                }
                if (isset($parsed_url['scheme']) && isset($parsed_url['host'])) {
                    $scheme = $parsed_url['scheme'];
                    $host = $parsed_url['host'];
                    $path = $parsed_url['path'] ?? '';
                    $query = $parsed_url['query'] ?? '';
                    $fragment = $parsed_url['fragment'] ?? '';
    
                    if($host === $ownDomain) return $url;
    
                    $query = $query ? '?' . $query . '&url=' . urlencode($scheme . '://' . $host) : '?url=' . urlencode($scheme . '://' . $host);
                    $fragment = $fragment ? '#' . $fragment : '';
    
                    $replacement = "https://" . $ownDomain . $path . $query . $fragment;
    
                    return $replacement;
                } else {
                    return $url; // Ignoriere URLs ohne Schema oder Host
                }
            },
            $content
        );
    }
    
    if(!isset($_SERVER['HTTP_REFERER']) || $isGivenURL) $content = str_replace($domain, $ownDomain, $content);
    
    $content = replaceURLs($content, $ownDomain);
    
    foreach ($headers as $key => $value) {
        if($key === "primary_ip"){
            $goalIP = $value;
            addIPGoal($clientIP, $goalIP);
        }
    
        $key = str_replace($localIP, $clientIP, $key);
        $value = str_replace($localIP, $clientIP, $value);
    
        if($goalIP){
            $key = str_replace($goalIP, $localIP, $key);
            $value = str_replace($goalIP, $localIP, $value);
        }
    
        $key = str_replace($domain, $ownDomain, $key);
        $value = str_replace($domain, $ownDomain, $value);
        header("$key: $value");
    }
    
    header("amb: $blocked");
    
    echo $content;
    Alles anzeigen

    Vielen Dank für eure Hilfe!

  • Syntafin
    27
    Syntafin
    LISTstack Dev
    Reaktionen
    498
    Punkte
    7.783
    Trophäen
    2
    Beiträge
    1.414
    • 28. August 2023 um 15:51
    • #2

    Sieht ja soweit ganz gut aus.

    Ein paar Tipps:

    Statt MySQLi verwende lieber PDO und zB eine Environment Datei, so lässt du die Zugangsdaten aus den eigentlichen Dateien raus :) .

    Zu deinem Problem:

    Du scheinst die IP Adresse zu einer Domain einfach aufzurufen, das klappt bei Load Balancern und solchen Anbietern wie Cloudflare nicht, da diese ihre eigene IP davorstellen, du würdest also am Ende Millionen von Seiten versuchen alle über die selbe IP zu erreichen.

    A red dragon falls from the heavens... Ah, that memory has been lost. A shame. It was a favorite of mine...

  • ai3x
    1
    ai3x
    Gast
    • 28. August 2023 um 17:43
    • #3
    Zitat von Syntafin

    Sieht ja soweit ganz gut aus.

    Ein paar Tipps:

    Statt MySQLi verwende lieber PDO und zB eine Environment Datei, so lässt du die Zugangsdaten aus den eigentlichen Dateien raus :) .

    Zu deinem Problem:

    Du scheinst die IP Adresse zu einer Domain einfach aufzurufen, das klappt bei Load Balancern und solchen Anbietern wie Cloudflare nicht, da diese ihre eigene IP davorstellen, du würdest also am Ende Millionen von Seiten versuchen alle über die selbe IP zu erreichen.

    Es gibt leider noch mehr unschöne Dinge in dem Code:

    - Der Code verwendet Benutzereingaben direkt in SQL-Abfragen, ohne diese ausreichend zu säubern. Dadurch besteht die Gefahr von SQL-Injection-Angriffen. Verwende vorbereitete Anweisungen oder parameterisierte Abfragen, um dies zu verhindern.

    - Der Code behandelt Fehler bei verschiedenen Operationen, wie der SQL-Verbindung oder cURL-Anfragen, nicht ordnungsgemäß. Es ist wichtig, eine angemessene Fehlerbehandlung zu implementieren, um aussagekräftige Nachrichten bereitzustellen und Fehler ordentlich zu behandeln.

  • flyingtable07
    18
    flyingtable07
    Mitglied
    Reaktionen
    59
    Punkte
    3.564
    Trophäen
    1
    Beiträge
    678
    • 30. August 2023 um 07:42
    • #4
    Zitat von Syntafin

    Sieht ja soweit ganz gut aus.

    Ein paar Tipps:

    Statt MySQLi verwende lieber PDO und zB eine Environment Datei, so lässt du die Zugangsdaten aus den eigentlichen Dateien raus :) .

    Zu deinem Problem:

    Du scheinst die IP Adresse zu einer Domain einfach aufzurufen, das klappt bei Load Balancern und solchen Anbietern wie Cloudflare nicht, da diese ihre eigene IP davorstellen, du würdest also am Ende Millionen von Seiten versuchen alle über die selbe IP zu erreichen.

    Woher wusstest du eigentlich das ist die Zugangsdaten auslesen wollte?
    Eigentlich brauch ich den WebProxy für meine Suchmaschiene. Ich möchte, dass wenn man einen EIntrag anklickt, die seite dirket daneben in einer kleinen vorschau besuchen kann. Das wäre eine verbesserung zu google, wo man jede seite direkt aufrufen muss. So könnte man viel schneller die suchergebnisse durchgehen und Informationen finden. Ich hab versucht die Seite direkt in ein Iframe einzubetten aber leider blockieren dass 9/10 seiten. Deshalb der Webproxy. Das mit dn Zugangsdaten ist mir so in den Sinn gekommen und ich wollte das unbedingt mal ausprobieren.
    Was ist eine Environment Datei?
    Ah das mit der Ip ergibbt sinn. Leider löst es nicht mein Problem. Heißt es, dass es unmöglich ist cloudflare geschützte seiten über einen webprxy aufzurufen?

    Meine Suchmaschiene Version 1: Tilo Search (tilo-behnke.de)

  • flyingtable07
    18
    flyingtable07
    Mitglied
    Reaktionen
    59
    Punkte
    3.564
    Trophäen
    1
    Beiträge
    678
    • 30. August 2023 um 07:43
    • #5
    Zitat von ai3x

    Es gibt leider noch mehr unschöne Dinge in dem Code:

    - Der Code verwendet Benutzereingaben direkt in SQL-Abfragen, ohne diese ausreichend zu säubern. Dadurch besteht die Gefahr von SQL-Injection-Angriffen. Verwende vorbereitete Anweisungen oder parameterisierte Abfragen, um dies zu verhindern.

    - Der Code behandelt Fehler bei verschiedenen Operationen, wie der SQL-Verbindung oder cURL-Anfragen, nicht ordnungsgemäß. Es ist wichtig, eine angemessene Fehlerbehandlung zu implementieren, um aussagekräftige Nachrichten bereitzustellen und Fehler ordentlich zu behandeln.

    jaja du hast recht. ich kümmer mich später um die Sauberheit des Codes hauptsache es läuft erstmal.

  • Syntafin
    27
    Syntafin
    LISTstack Dev
    Reaktionen
    498
    Punkte
    7.783
    Trophäen
    2
    Beiträge
    1.414
    • 30. August 2023 um 10:24
    • #6
    Zitat von flyingtable07

    Was ist eine Environment Datei?

    Erklärt es ganz gut:

    DOTENV in PHP
    When we are creating a project, there are always some sensitive values, and at the beginning we don't...
    dev.to
    Zitat von flyingtable07

    Ah das mit der Ip ergibbt sinn. Leider löst es nicht mein Problem. Heißt es, dass es unmöglich ist cloudflare geschützte seiten über einen webprxy aufzurufen?

    möglich ist das schon, nur eben nicht über die IP, du könntest via cURL die Seite abrufen und dann das zurückgelieferte HTML anzeigen, macht dann nur noch CORS ein Problem.

    Zitat von flyingtable07

    jaja du hast recht. ich kümmer mich später um die Sauberheit des Codes hauptsache es läuft erstmal.

    Mach es jetzt, die Sicherheit einer Anwendung ist stets Priorität Nummer 1.

    A red dragon falls from the heavens... Ah, that memory has been lost. A shame. It was a favorite of mine...

  • ai3x
    1
    ai3x
    Gast
    • 30. August 2023 um 18:23
    • #7

    Ich würde dir gerne noch 2 Dinge mit auf den Weg geben...

    1. Wer urheberrechtlich geschützte Inhalte über ein IFRAME einbindet, obwohl der Urheber technische Maßnahmen getroffen hat, die dies verhindern sollen, verstößt gegen das Urheberrecht. Dies ist zumindest dann der Fall, wenn diese Maßnahmen umgangen werden.

    2. Für alle Inhalte die du direkt in deine Seite einbindest haftest du auch...außer man kann explizit erkennen das es sich um fremde Inhalte handelt.

  • flyingtable07
    18
    flyingtable07
    Mitglied
    Reaktionen
    59
    Punkte
    3.564
    Trophäen
    1
    Beiträge
    678
    • 30. August 2023 um 18:57
    • #8
    Zitat von ai3x

    Ich würde dir gerne noch 2 Dinge mit auf den Weg geben...

    1. Wer urheberrechtlich geschützte Inhalte über ein IFRAME einbindet, obwohl der Urheber technische Maßnahmen getroffen hat, die dies verhindern sollen, verstößt gegen das Urheberrecht. Dies ist zumindest dann der Fall, wenn diese Maßnahmen umgangen werden.

    2. Für alle Inhalte die du direkt in deine Seite einbindest haftest du auch...außer man kann explizit erkennen das es sich um fremde Inhalte handelt.

    puh ich das alles kompliziert.
    Warum kann das Internet nicht einfach ein gemütlicher Ort zum programmieren sein

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Tags

  • php
  • webproxy

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung