d.schmidt: URL aufruf aus html durch Linux

Hallo,

ich habe das Problem das ich ein Programm xyz per url Generierung steuere , sprich ich gebe in die URL die IP der Anlage, user name passwort und zuvor generierte Session, und kann so verschiedene dinge steuern.

Nun der Fall das jemand eine Aktion ausführen will, un er auf den Button clickt, da ist ein Script hinterlegt das die URL mit den Parametern generiert. wird ein neues Fenster jedesmal geöffnet, das stört schon einmal, und falls jemand von außerhalb drauf zugreift geht es erst reicht nicht da er ja nicht im selben Netzwerk ist (URL setzt sich ja unter anderem aus der anlagen ip zusammen) Kann ich dem Browser sagen er soll es im Linux ausführen ?(Website ist auf Webserver bzw raspian) dann würde der kunde nicht immer ein neues Fenster beim ausführen sehen, und er kann es auch von außerhalb ausführen da der Webserver ja im netz steht.

Liebe Grüße im vorraus

  1. Hallo d.schmidt,

    du hast also eine HTML-Seite, auf der Du bestimmte Informationen hinterlegt hast und dann einen Button klickst. Diese HTML Seite wurde von einem Raspi geliefert.

    Der Button macht dann... was? Dieses Script könntest Du uns einmal zeigen. Vielleicht auch das HTML dazu, zumindest exemplarisch (und natürlich ohne IPs, User und Passwörter).

    Ohne etwas gesehen zu haben würde ich vermuten, dass Du mit window.open arbeitest, und dann das Problem hast, dass die verwendeten IPs auf dem Gerät, das die HTML Seite anzeigt, nicht im richtigen Netz sind. D.h. Du musst Dich für die gewünschte Aktion an den Webserver auf dem Raspi wenden, dass er sie für Dich ausführt. Das geht aber nur, wenn auf dem Raspi eine scriptfähige Komponente existiert, die vom Webserver genutzt werden kann. Was genau hast Du auf dem Raspi laufen? Apache? PHP? Perl? Node.js? Was anderes?

    Eine Delegation an den Raspi tut ohnehin not, denn es ist ein unverantwortliches Sicherheitsleck, Geräte-IPs, User-IDs und Passwörter blindlings in die Wilde Weite Welt zu blasen. Du kannst das lindern, wenn Du mit https arbeitest und der Zugang zum Raspi über UserId+Passwort gesichert ist, aber NÖTIG ist es nicht. Diese Informationen müssen auf dem Raspi bleiben.

    Durchführen würde man die Delegation dann entweder über einen HTTP POST (ein <form>) oder über einen AJAX-Request. Über die Details unterhalten wir uns, wenn Du etwas mehr von deiner Infrastruktur beschrieben hast.

    Rolf

    --
    sumpsi - posui - clusi
    1. ein mix aus HTML Java und php

      <?php
           $xuser = $_SESSION['user'];			
      	$xpbxip = $_SESSION['pbxip'];
      	$xpbxuser = $_SESSION['pbxuser'];
      	$xpbxpw = $_SESSION['pbxpw'];
      	$xpbxid = $_SESSION['pbxID'];
                  ?>
      
      
      		
      						 
      <script>
      	function showAlert() {
          var xuser ='<?php echo $xuser;?>';
      	var xpbxip ='<?php echo $xpbxip;?>';
      	var xpbxid ='<?php echo $xpbxid;?>';
      	var xpbxuser ='<?php echo $xpbxuser;?>';
      	var called = document.getElementById("Eingabefeld").value;
      	
      	var link ='https://'+ xpbxip +':8802/cgi-bin/gadgetapi?cmd=MkCall&callingDevice='+ xpbxuser +'&calledDirectoryNumber='+ called +'&gsSession='+  xpbxid +'';
          window.open(link, '_blank');         
      
      	
      	
      				 
      					
      }
      </script>
      
      
      
                              <form class="form-horizontal form1" role="form" parsley-validate> 
                                <div class="form-group">
                                  <label for="fullname" class="col-sm-2 control-label">Anzurufende Nummer</label>
                                  <div class="col-sm-10">
                                    <input type="number" class="form-control" id="Eingabefeld" parsley-validation-minlength="7">
                                  </div>
      							 <input type="button" value="Anruf Absetzen" onclick="showAlert()">
      							</div>
                                </div>
                               </form>
      

      Ich verwende tatsächlich window.open, sollte später ja aber anders gelöst werden, nach aktuellem stand generiert er den link u öffnet ihn im kunden Browser was sie bereits richtig erkannt habend das soll er nicht. Mein Webserver hat php, node und perl, (apache2) kann aber natürlich noch weiteres drauf machen falls benötigt

      das gesamte Panel ist natürlich per login geschützt. sowie auch die tk anlage

      Aufbau :

      Login (Session für das Panel holen und Userdaten in Arry schreiben) (anschließend mit userdaten an tk Anlage anmelden per https, und zurückgelieferte session id (pbxid) auch ins arry schreiben) somit haben wir eine gültige session für unser Panel in dme wir nun sind, und für die tk anlage die wir nun mithilfe der userdaten und der aktiven session per url steuern können.

      Das ist schon das ganze Gerüst , Scriptauszug ist von der Seite "Anruf absetzen" was natürlich sinnig ist.

      Vielen Dank, für die Zeit im voraus....

      1. Würde ich auch so machen: Nach dem Einloggen stehen dann im Backends die Links zur Auswahl die requestet werden können. Wie der Request erfolgt und was danach passieren soll, hängt davon ab wie die Response aussieht. Soll die Seite stehenbleiben, empfiehlt sich ein Ajaxrequest. Vermutlich wird die Response entweder Erfolg//Fehler beinhalten, was einfach auszugeben wäre.

        Andernfalls (kein Ajax) kriegt der Browser die Response und landet auf der requesteten Adresse. Hier kann der Benutzer entweder den Backbutton klicken oder die Response hat einen Link zurück zur Übersichtsseite.

        Ich würde die Ajaxlösung bevorzugen das ist am Einfachsten umzusetzen. MfG

      2. Lieber d.schmidt,

        ein mix aus HTML Java und php

        nein, kein Java. Aber JavaScript.

        <?php
             $xuser = $_SESSION['user'];			
        	$xpbxip = $_SESSION['pbxip'];
        	$xpbxuser = $_SESSION['pbxuser'];
        	$xpbxpw = $_SESSION['pbxpw'];
        	$xpbxid = $_SESSION['pbxID'];
                    ?>
        

        Wozu die Umkopiererei? Das ist gefährlich, weil der Programmierer den Ursprung der Daten nicht mehr einschätzen kann - und deshalb ihnen vielleicht unnötig misstraut, oder sie unnötig umwandelt (maskiert) - im besten Fall. Im schlimmsten Fall ist es genau anders herum und Sicherheitslücken werden unnötig aufgerissen! Verwende die Schreibweise mit den Session-Indices (siehe unten beim JavaScript), auch wenn das mehr Schreibarbeit zu sein scheint.

        	function showAlert() {
            var xuser ='<?php echo $xuser;?>';
        	var xpbxip ='<?php echo $xpbxip;?>';
        	var xpbxid ='<?php echo $xpbxid;?>';
        	var xpbxuser ='<?php echo $xpbxuser;?>';
        	var called = document.getElementById("Eingabefeld").value;
        	
        	var link ='https://'+ xpbxip +':8802/cgi-bin/gadgetapi?cmd=MkCall&callingDevice='+ xpbxuser +'&calledDirectoryNumber='+ called +'&gsSession='+  xpbxid +'';
            window.open(link, '_blank');         
        }
        

        Schon wieder Umkopiererei! Warum nur?!? Du verwendest diese ganzen Variablen noch nicht einmal. Warum daher nicht so?

        	function showAlert() {
            window.open(
                "https://"
                    + "<?php echo $_SESSION['pbxip'];?>"
                    + ":8802/cgi-bin/gadgetapi?cmd=MkCall&callingDevice="
                    + "<?php echo $_SESSION['pbxuser'];?>"
                    + "&calledDirectoryNumber="
                    // kontextgerecht kodieren
                    + encodeURIComponent(
                        document.getElementById("Eingabefeld").value
                    )
                    + "&gsSession="
                    + "<?php echo $_SESSION['pbxID'];?>",
                "_blank"
            );         
        }
        

        In JavaScript verwende ich konsequent die doppelten Anführungszeichen, wenn es geht. In PHP haben diese ja eine leicht andere Bedeutung ("$var" != '$var'), aber in JavaScript verwende ich die einfachen nur dann, wenn ich damit doppelte einfassen muss (var s = '<p class="hint">...</p>';).

        <input type="button" value="Anruf Absetzen" onclick="showAlert()">
        

        Wenn Du mittels showAlert ohnehin ein neues Fenster öffnest, wozu dann noch das Formular? Es sei denn, Du änderst die Sache mit dem window.open und führst nach dem Absenden des Formulars zu einer PHP-generierten Fassung des Fensters (mit zurück-Button zum Forumlar vielleicht?), um diese Fensterei einzudämmen.

        Ich verwende tatsächlich window.open, sollte später ja aber anders gelöst werden, nach aktuellem stand generiert er den link u öffnet ihn im kunden Browser was sie bereits richtig erkannt habend das soll er nicht.

        Deine Formulierungen strengen mich an, da sie nicht sofort klar verständlich sind. Wenn Du kostenlose Hilfe willst, dann solltest Du klarer formulieren, um den Hilfswilligen das Helfen so leicht wie möglich zu machen.

        das gesamte Panel ist natürlich per login geschützt. sowie auch die tk anlage

        Aha... und wie genau? Wo werden die Login-Daten vorgehalten? Wie wird der Login geprüft?

        Aufbau :

        Login (Session für das Panel holen und Userdaten in Arry schreiben) (anschließend mit userdaten an tk Anlage anmelden per https, und zurückgelieferte session id (pbxid) auch ins arry schreiben) somit haben wir eine gültige session für unser Panel in dme wir nun sind, und für die tk anlage die wir nun mithilfe der userdaten und der aktiven session per url steuern können.

        Das ist kein Satz. Zumindest ist er grammatisch nicht korrekt und daher nur sehr mühsam zu verstehen. Ändere das! Das ist kein Unvermögen, das ist Nachlässigkeit, weil Du meinst, dass es keine Wichtigkeit hätte!

        Zum beschriebenen Vorgehen: Ihr (oder Du) tunnelt sozusagen eine Session von einer Client-Server-Kombination zu einer Client_s_-Server-Kombination, damit viele andere Clients über einen anderen Server diese eine Session auf diesem einen Server benutzen können.

        Klingt das nach einem sicheren Konzept? Kann man da im Zweifel nachprüfen, wer da was gedreht hat? Da vermute ich ganz stark ein (um-Gottes-Willen-)nein.

        Vielleicht ist es für Dich ebensowenig wichtig, wie auch die Verständlichkeit Deiner Formulierungen, aber damit sollen ja andere verantwortungsvoll umgehen. Insbesondere "Kunden"! Und wenn dann kräftig Schindluder getrieben wurde... dann musst unter Umständen Du den Kopf dafür hinhalten!

        Liebe Grüße,

        Felix Riesterer.

        1. Hallo Felix,

          Wozu die Umkopiererei? Das ist gefährlich, weil der Programmierer den Ursprung der Daten nicht mehr einschätzen kann…

          Im Allgemeinen hast Du recht. Bei diesem potenziellen 10-Zeiler geht's noch. Und es ist - gerade wenn jemand nicht unbedingt die große Erfahrung hat - auch viel schwieriger, die tiefe Schachtelung zu verstehen.

          Selbst Du bist Auch ich bin reingefallen, das hier

          ...  "https://"
                + "<?php echo $_SESSION['pbxip'];?>"
                + ...
          

          funktioniert nicht doch. Sorry. So blöd kann man dabei reinfallen, aber eigentlich beweise ich damit meinen Punkt 😂. Ich habe deine Strings als PHP-Strings gelesen, und dann wäre "$_SESSION['pbxip']" ein Syntaxfehler gewesen...

          Aber das Thema "URL zur OSBiz in JS zusammenbauen" erübrigt sich sowieso, das ist worst practice. Es darf nur einen Postback oder Ajax-Call geben, basierend auf dem Inhalt des input mit id='Eingabefeld'. Dieser Inhalt muss übrigens noch auf validiert werden, 7 Stellen reichen nicht. DNs für Telefone sind normalerweise schön numerisch, und je nach dem, ob eine Amtsanlassung (meistens die 0) erlaubt ist, musst Du das auch prüfen. Sonst haut jemand zwei Nullen vorneweg und ruft im Weißen Haus an. Oder die Zeitansage in Tokio.

          das gesamte Panel ist natürlich per login geschützt. sowie auch die tk anlage

          Aha... und wie genau? Wo werden die Login-Daten vorgehalten? Wie wird der Login geprüft?

          Ist jetzt außerhalb des Scope der Anfrage, aber natürlich grundsätzlich interessant.

          Also, D.Schmidt, Du solltest auf keinen Fall die Connection-Daten für die TK-Anlage auf den Client geben. Weder User-ID, noch Passwort, noch IP, noch die OpenScape-Session ID. Das muss alles auf dem Raspi bleiben. Du musst auch ein Konzept haben, welcher User welche Telefone fernsteuern darf! Stell Dir vor: Chef X führt Mitarbeitergespräch mit Kollege Y. Kollege Z sieht das, lässt das Telefon von X bei sich anrufen und hört das Gespräch mit. Danach posaunt Z herum, dass Y einen Einlauf wegen vermasselter Verkäufe bekommen hat. Oder schwanger ist (wenn's Frau Y ist). Wenn sowas passiert, hackt Dir eure Revision die Finger einzeln ab. Mit einer stumpfen Axt. Glied für Glied. Und wenn nicht die Revision, dann Frau Y.

          Wenn das soweit klar ist…

          Du hast serverseitiges PHP, ok. Den MakeCall, oder auch andere OSBiz-Funktionen, solltest Du aus PHP heraus absetzen, ausgelöst entweder durch einen POST des Form oder durch einen Ajax-Call mit XMLHttpRequest oder Fetch. Wie Du unter Raspbian aus PHP einen Webrequest absetzt, weiß ich nicht; die unter PHP.NET beschriebenen Wege scheinen alle irgendwelche PECLs zu brauchen die es nicht für Raspbian gibt. Aber bestimmt hat hier irgend ein Raspi-Spezialist eine Idee.

          Du musst auch sowas wie ein "Action Ticket" haben. Das ist eine Zufallszahl, die Du im Form unterbringst, und die auch in der Session steht. Ein Telefonanlagenkommando wird akzeptiert, wenn der Client-Request das richtige Action Ticket mitbringt. Danach wird ein neues generiert, in der Session gespeichert und dem Client übermittelt (wie genau, hängt davon ab ob Du POST oder AJAX machst). Kommt ein falsches Ticket, wird die Session sofort verworfen. Sinn ist, dass ein böser User sich keine URLs oder Requests aufzeichnet und damit Dinge tut, die er nicht tun darf.

          Generell ist natürlich auch noch fraglich, ob das, was Du da machst, rentabel ist. Unify ATOS hat für solche Aktionen eine Menge Tools in der Schublade. Ich bin nicht bei denen, aber mit OpenScape Voice und Genesys ein teurer Kunde... Natürlich nehmen die dafür eine Menge Euros, aber dafür geben sie auch Garantie, bringen Security-Konzepte mit und deine Stunden sind auch was wert.

          Denk noch mal nach, bevor Du eine solche Tretmine in die Welt setzt.

          Rolf

          --
          sumpsi - posui - clusi
        2. <?php
               $xuser = $_SESSION['user'];			
          	$xpbxip = $_SESSION['pbxip'];
          	$xpbxuser = $_SESSION['pbxuser'];
          	$xpbxpw = $_SESSION['pbxpw'];
          	$xpbxid = $_SESSION['pbxID'];
                      ?>
          

          Wozu die Umkopiererei? Das ist gefährlich, weil der Programmierer den Ursprung der Daten nicht mehr einschätzen kann - und deshalb ihnen vielleicht unnötig misstraut, oder sie unnötig umwandelt (maskiert) - im besten Fall.

          Du spielst auf einen möglichen Kontextwechsel an, dabei spielt es aber keine Rolle ob der Programmierer der Quelle der Daten vertraut oder nicht, eine kontextgerechte Behandlung muss so oder so stattfinden. Denn auch gutmütige Daten brauchen diese Kontextbehandlung. Deshalb sehe ich das Kopieren auch nicht als Problem. Auch der Speicherbedarf wird dadurch nicht nennenswert wachsen, weil PHP Variablen nur kopiert, wenn sich deren Inhalt tatsächlich ändert, ansonsten wird die Variable intern als Referenz gehandhabt - nennt sich copy-on-write. Wenn man befindet, dass es den Quelltext lesbarer macht, wenn man Array-Inhalte in Variablen kopiert, wieso nicht?

  2. Lieber d.schmidt,

    wenn Du Dir nicht die Mühe machst, Dein Problem so verständlich zu beschreiben, dass ich beim Lesen gleich verstehe, was Du meinst, dann mache ich mir nicht die Mühe, darüber nachzudenken.

    Von mir bekommst Du so keine Hilfe.

    Liebe Grüße,

    Felix Riesterer.