Ankündigung

Einklappen
Keine Ankündigung bisher.

cURL und open_basedir Restriktion -HILFE-

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • cURL und open_basedir Restriktion -HILFE-

    Hallo,

    ich kenne mich mit Php leider garnicht aus und hoffe mir kann hier jemand weiterhelfen.

    Auf einer Webseite soll ein Formular-Skript von einem Merchant eingebunden werden, welches die cURL Funktion nutzt.

    Dabei nutze ich einen Shared Hoster bei dem wie gewöhnlich eine open_basedir Restriktion vorliegt.

    Nun erhalte ich die Fehlermeldung:

    CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set
    Im Internet habe ich verschiedene Workarounds auf Englisch gefunden, die sich mir in der Umsetzung aber leider nicht erschlossen haben.


    Die verwendeten Dateien sehen folgendermaßen aus:


    index.php
    PHP-Code:
    <?php
        
    // Anmerkung: 
        // Titel, HTML und CSS kann frei angepasst werden, nur das JavaScript und 
        // die drei PHP Befehle sollten nicht entfernt werden
        
        // Formular Modul laden
        
    include('Anbieter-lib.php');    
    ?>
    <!DOCTYPE html>
    <html>
    <head>
        <title>Formular</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        
        <!-- Standard JavaScript laden (MUSS immer geladen werden): -->
        <script type="text/javascript" src="?f=js<?php echo trim($_GET['page']); ?>"></script>
        
        <!-- Dieser Befehl l�dt das Standard CSS: --> 
        <link rel="stylesheet" media="all" type="text/css" href="?f=css" />
        
        <!-- Alternativ kann auch ein eigenes Stylesheet geladen werden: -->
        <!--<link rel="stylesheet" media="all" type="text/css" href="custom.css" />-->
    </head>

    <body>


    <div style="text-align:left">
    <?php Anbieter_show_form(); ?>
    </div>


    </body>
    </html>

    Anbieter-lib.php
    PHP-Code:
    <?php
        
        
    /*
        ** Anbieter Whitelabel Proxy Code (v0.3 - cURL Version)
        */
        
        //
        // Konfiguration
        //
        
        
    $Anbieter_config = array(
        
            
    // Bitte hier die 9000 durch die eigene Partner ID austauschen:
            
    'pid' => 9000,
            
            
    // Standard Sub-ID, wird ggf. weiter unten durch URL-Parameter überschreiben
            // (kann leer bleiben) Bsp: 'subid' => 'subtest',
            
    'subid' => '',
            
            
    // Sollen die Daten per 'http' oder verschlüsselt per 'https' übertragen werden?
            // (kann entsprechend geändert werden, wenn passendes Modul fehlt)
            
    'protocol' => 'http'
            
        
    );
        
        
    // Wenn vorhanden Sub-ID aus URL-Parameter (&subid=) übernehmen
        // (falls nicht gewünscht, einfach die komplette nächste Zeile entfernen)
        
    if (isset($_GET['subid'])) $Anbieter_config['subid'] = $_GET['subid'];

        
    //
        // Ab hier muss nichts mehr angepasst werden
        //

        
    if (!function_exists('curl_init')) die('Fehler: Das zur Ausführung notwendige cURL PHP Modul ist nicht installiert!');
        
        
    $Anbieter_base_url 'https://www.Anbieter.de/web-control/wl_proxy.php';
        
    $Anbieter_base_url_images 'https://www.Anbieter.de/images/';
        
        unset(
    $Anbieter_config['protocol']);
        
        
    $bk_conn curl_init();    

        
    $bk_static_file = isset($_GET['f']) ? trim($_GET['f']) : '';


        if (
    $bk_static_file){
            if (
    substr($bk_static_file02) == 'js'){ header('Content-Type: application/javascript'); }
            else if (
    $bk_static_file == 'css'){ header('Content-Type: text/css'); }
            else {
                if (
    substr($bk_static_file, -3) == 'jpg'){ header('Content-type: image/jpeg'); }
                else if (
    substr($bk_static_file, -3) == 'gif'){ header('Content-Type: image/gif'); }
                else if (
    substr($bk_static_file, -3) == 'png'){ header('Content-Type: image/png'); }
                
    $Anbieter_base_url $Anbieter_base_url_images.$bk_static_file;
            }
            
    Anbieter_request($Anbieter_base_url '?f=' $bk_static_filefalse); 
            exit;
        }

        function 
    Anbieter_show_form(){
            global 
    $bk_conn$Anbieter_base_url$Anbieter_config;
            
            if (
    $_SERVER['REQUEST_METHOD'] == 'POST'){
                
    curl_setopt($bk_connCURLOPT_POST1);
                
    curl_setopt($bk_connCURLOPT_POSTFIELDShttp_build_query($_POST));
            }

            
    $user_params = array('page''f''bk_aid''c');
            
            foreach (
    $user_params as $p)
                if (isset(
    $_GET[$p])) $Anbieter_config[$p] = $_GET[$p];
                            
            if (isset(
    $_SERVER['HTTP_REFERER'])) 
                
    curl_setopt($bk_connCURLOPT_REFERER$_SERVER['HTTP_REFERER']);
            
            
    Anbieter_request($Anbieter_base_url '?' http_build_query($Anbieter_config));
        }

        function 
    Anbieter_request($url$get_header=true){
            global 
    $bk_conn$Anbieter_base_url;
            
    curl_setopt($bk_connCURLOPT_URL$url);
            
    curl_setopt($bk_connCURLOPT_SSL_VERIFYPEERfalse);
            
    curl_setopt($bk_connCURLOPT_USERAGENT'wlproxy');
            
    curl_setopt($bk_connCURLOPT_HEADER$get_header);
            
    curl_setopt($bk_connCURLOPT_RETURNTRANSFERtrue);
            
    curl_setopt($bk_connCURLOPT_TIMEOUT30);
            
    curl_setopt($bk_connCURLOPT_FOLLOWLOCATIONfalse);
            
    curl_setopt($bk_connCURLOPT_MAXREDIRS5);

            
    $output curl_exec($bk_conn);
                        
            if (
    $get_header){
            
                list(
    $header$output) = explode("\r\n\r\n"$output2);
                        
                if (
    preg_match('/<!--redir-->/'$output) && preg_match('/Location: ([^\r\n]+)/i'$header$m)){
                            
                    
    $url $m[1];
                    
                    if (!
    preg_match('/^https?:/i'$url)) 
                        
    $url $Anbieter_base_url $url;
                    
                    
    curl_setopt($bk_connCURLOPT_URL$url);
                    
    curl_setopt($bk_connCURLOPT_HEADER0);
                    
                    
    $output curl_exec($bk_conn);
                }
                
            }
            
            echo 
    preg_replace('/\/images\/([a-z_]+)\.([jpg|gif|png]+)/is''?f=$1.$2'$output);
            
            
    curl_close($bk_conn);
        }

    ?>

    json.php
    PHP-Code:
    <?php

    // Hier sind keine Anpassungen notwendig

    define('POSTURL''https://www.Anbieter.de/json.php');
    define('POSTVARS'http_build_query($_REQUEST));  // POST VARIABLES TO BE SENT
     
    // INITIALIZE ALL VARS
    $ch='';

    if(
    $_SERVER['REQUEST_METHOD']==='POST') {  // REQUIRE POST OR DIE
        
    $ch curl_init(POSTURL);
        
    curl_setopt($chCURLOPT_POST      ,1);
        
    curl_setopt($chCURLOPT_POSTFIELDS    ,POSTVARS);
        
    curl_setopt($chCURLOPT_FOLLOWLOCATION  ,1);
        
    curl_setopt($chCURLOPT_HEADER      ,0);      // DO RETURN HTTP HEADERS
        
    curl_setopt($chCURLOPT_RETURNTRANSFER  ,1);  // RETURN THE CONTENTS OF THE CALL
        
    $output curl_exec($ch);
        echo 
    $output;   
        
    curl_close($ch);
    } else die(
    'Hacking attempt Logged!');
     
    exit;

    ?>

    Das ist der gesamte Code. Das Formular an sich ist beim Anbieter gehostet.
    Gibt es eine Möglichkeit für mich das Ganze zum Laufen zu bekommen ohne auf einen eigenen Server umsteigen zu müssen?

    Würde mich über eure Hilfe sehr freuen.

    Vielen Dank im Voraus
    Christof


  • #2
    Du könntest anstatt CURLOPT_FOLLOWLOCATION auch selbst den Header ziehn und evtl. weitere Requests absenden.
    Zitat von nikosch
    Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.

    Kommentar


    • #3
      Hi,

      danke für den Hinweis. Leider verstehe ich den Code überhaupt nicht. Hatte gehofft es reicht Befehle umzuschreiben oder leicht zu verändern.
      Etwas Aufwendigeres zu bewerkstelligen bin ich leider nicht in der Lage.

      Wenn ich jemanden beauftrage, das für mich zu machen, wieviel Zeit müsste derjenige hier investieren?
      Ich schalte am Besten eine Stellenausschreibung hier im Forum.


      Im Netz habe ich noch folgende Lösung gefunden. Könnte ich diese verwenden?

      PHP-Code:
      Nun zur LösungIch habe eine PHP-Funktion geschriebenwelche das macht was auch CURLOPT_FOLLOWLOCATION macht und die man auch nutzen kann wenn open_basedir gesetzt ist.


      Normalerweise würde eine CURL Befehl so aussehen:



      $ch1 curl_init();
      curl_setopt($ch1CURLOPT_URL,'http://example.com/irgend/ein/pfad');
      curl_setopt($ch1CURLOPT_RETURNTRANSFERtrue);
      curl_setopt($ch1,CURLOPT_COOKIEJAR,'./cookies.txt');
      curl_setopt($ch1,CURLOPT_COOKIEFILE,'./cookies.txt');
      curl_setopt($ch1CURLOPT_FOLLOWLOCATIONtrue);

      $responde1 curl_exec_follow($ch1);
      curl_close($ch1);
      Wenn man CURLOPT_FOLLOWLOCATION nutzen kannMeine auch hier funktionierende Version sieh so aus:



      function 
      curl_exec_follow($curl, &$maxredirect 5) {

      $mr $maxredirect;
      if (
      $mr 0) {
      $newurl curl_getinfo($curlCURLINFO_EFFECTIVE_URL);
      $rcurl curl_copy_handle($curl); curl_setopt($rcurlCURLOPT_HEADERtrue);
      curl_setopt($rcurlCURLOPT_NOBODYtrue);
      curl_setopt($rcurlCURLOPT_FORBID_REUSEfalse);
      curl_setopt($rcurlCURLOPT_RETURNTRANSFERtrue);
      do {
      curl_setopt($rcurlCURLOPT_URL$newurl);
      $header curl_exec($rcurl);
      if (
      curl_errno($rcurl)) {
      $code 0;
      } else {
      $code curl_getinfo($rcurlCURLINFO_HTTP_CODE);
      if (
      $code == 301 || $code == 302) {
      preg_match('/Location:(.*?)\n/'$header$matches);
      $newurl trim(array_pop($matches));
      } else {
      $code 0;
      }
      }
      }while (
      $code && --$mr);
      curl_close($rcurl);
      if (
      $mr 0) {
      curl_setopt($curlCURLOPT_URL$newurl);
      }
      }
      if(
      $mr == && $max_redirects 0) {
      return 
      false;
      } else {
      return 
      curl_exec($curl);
      }
      }

      $ch1 curl_init();
      curl_setopt($ch1CURLOPT_URL,'http://example.com/irgend/ein/pfad');
      curl_setopt($ch1CURLOPT_RETURNTRANSFERtrue);
      curl_setopt($ch1,CURLOPT_COOKIEJAR,'./cookies.txt');
      curl_setopt($ch1,CURLOPT_COOKIEFILE,'./cookies.txt');
      curl_setopt($ch1CURLOPT_FOLLOWLOCATIONfalse);

      $responde1 curl_exec_follow($ch1);
      curl_close($ch1);
      Man kann auch noch als zusätzlichen Parameter die Anzahl der Maximalen Redirects über geben dazu einfach curl_exec_follow($ch1ANZAHLDER MAXIMALEN REDIRECTS); eingeben Standartmäßig ist es auf 5 Weiterleitungen begrentzt

      Kommentar


      • #4
        Ich habe jetzt in der json.php Datei den wert hinter der FollowLocation Funktion von 1 auf 0 gestellt. Es scheint jetzt zu funktionieren, bin mir aber noch nicht sicher.

        Könnt ihr mir sagen, ob ich damit die Funktion gestört habe?

        Kommentar


        • #5
          Also wie es scheint, funktioniert tatsächlich alles wie es soll.
          Nja, da hatte ich wohl Glück gehabt

          Kommentar

          Lädt...
          X