Web [PHP] Votifier Server Script/Socket Script

Dieses Thema im Forum "Programmierung" wurde erstellt von jensIO, 17. Dezember 2015.

?

Hilfreich

  1. Ja

  2. Nein

Results are only viewable after voting.
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. jensIO
    Offline

    jensIO

    Registriert seit:
    28. Juli 2015
    Beiträge:
    602
    Ort:
    Internet, im Neuland
    Minecraft:
    jens1o
    Hallo!

    In diesem Thread möchte ich euch ein Script von mir zeigen/der Öffentlichkeit geben... Damit kann man in PHP einen Vote an einen Minecraft Server senden(z.b. für eine Serverliste/oder eben leicht abgeändert für einen Austausch der Daten/Befehle/...) Das Script hab ich in anderer Form mithilfe einer mysteriösen Suchmaschine(nicht elgooG) gefunden. Das Gefundene habe ich umgeschrieben/abgeschrieben/mich daran orientiert für eine Serverliste, von der ich mich aufgrund Zeit- & Motivationsmangels getrennt habe. Dennoch möchte ich dieses Skript public stellen. Dieses ist nun Standalone fähig und vollständig kommentiert, das heißt keine externe Library ist mehr notwendig(RSA PHP Libary oder so) und sollte für den Anfänger auch verständlich sein. Ihr könnt alternativ auch selber googeln. ;)

    Mit dem Code könnt ihr machen was ihr wollt, ist OOP, müsst ihn nur
    PHP:
    1. <?php
    2.  
    3. // Hier einfügen(vor der nächsten Zeile) oder direkt das Script mit 'require_once "votifier.php";' einbinden
    4. $voteobjekt = new PHPVotifier();
    5. // Server-IP/Domain(String), Port(Int)(Standard: 8199), Username(String), Public Key(String) [evt. von MySQL laden]
    6. $voteobjekt->vote("localhost", 8199, "jens1o", "******Public Key******");
    7.  
    8. ?>
    einbinden.

    Der Code:
    PHP:
    1. <?php
    2.  
    3. class PHPVotifier {
    4.  
    5.         public function vote($server_ip, $server_port, $username, $public_key) {
    6.                 // Informationen zum Vote:
    7.                 //   1 = Serverliste
    8.                 //   2 = Username(von dem der gevotet hat)
    9.                 //   3 = IP Addresse(Identifizierung)
    10.                 //   4 = Zeit des Votes
    11.                 $votetext = "VOTE\n" . "jens-hausdorf.de\n" . $username ."\n" . $_SERVER["REMOTE_ADDR"] . "\n" . time() . "\n";
    12.      
    13.                 //  Ups? Da fehlen noch Bytes! Damit
    14.                 //  die Anfrage nur 256 Bytes groß ist(wichtig!):
    15.                 //  Wieviel fehlen noch?
    16.                 $leftover = (256 - strlen($votetext)) / 2;
    17.      
    18.                 //  Restliche Bytes dazu packen(als x0/NULL)
    19.                 while ($leftover > 0) {
    20.                         $votetext .= "\x0";
    21.                         $leftover--;
    22.                 }
    23.      
    24.                 //    Öffentlicher Key vorbereiten...
    25.                 $key = wordwrap($public_key, 65, "\n", true);
    26.                 $key = "-----BEGIN PUBLIC KEY-----\n" . $key . "\n-----END PUBLIC KEY-----";
    27.        
    28.                 //   Key encodieren/standalone Version mit OpenSSL
    29.                 //     (sollte vorinstalliert sein bei Hostern eurer Wahl)
    30.                 // falls nicht, kann nachinstalliert werden.        
    31.            
    32.            
    33.                try {
    34.                     openssl_public_encrypt($votetext, $encrypted, $key);
    35.                 } catch(Exception $e) {
    36.  
    37.                     exit("Fehler! " . $e->getMessage());
    38.  
    39.                  }
    40.      
    41.                 //  Verbindung mit Server aufbauen
    42.                 //    TIMEOUT 2 SEKUNDEN -> Check: ok?
    43.                 $socket = fsockopen($server_ip, $server_port, $errno, $errstr, 2);
    44.                 if(!$socket) {
    45.                         exit("Error: " . $errstr);
    46.                 } else {
    47.                         echo "Yooo/alles ok";
    48.                 }
    49.      
    50.                 // SEND DAT PACKAGE... Have fun :D
    51.                 // Fertig! Der Rest macht der Server
    52.                 fwrite($socket, $encrypted);
    53.      
    54.                 return true;
    55.         }
    56.  
    57. }
    58. ?>

    Ich hoffe ihr könnt damit was anfangen... und es nach euren Wünschen anpassen.


    Edit:
    Anmerkungen umgesetzt. Danke an jedes Feedback!
     
    #1
    hannes8101 gefällt das.
  2. ShareLock
    Offline

    ShareLock

    Registriert seit:
    2. November 2011
    Beiträge:
    70
    Nur weil da eine Klasse ist, ist das ganze noch lange nicht objekt orientiert und OpenSSL vorinstalliert? Naja, das ist so nicht ganz richtig.

    PS: Exceptions sind eine nette Erfindung.
     
    #2
    [Dev] iTzSasukeHDxLP gefällt das.
  3. jensIO
    Offline

    jensIO

    Registriert seit:
    28. Juli 2015
    Beiträge:
    602
    Ort:
    Internet, im Neuland
    Minecraft:
    jens1o
    Danke für dein Feedback:

    1. OOP: Jo, ich habs abgeändert
    2. OpenSSL Hinweis hinzugefügt. Bei meinem Hoster war das jedenfalls so...
    3. Wo möchtest du dort eine(n) Ausnahme/try-catch Blick hinzufügen? Bei OpenSSL ob die Erweiterung installiert ist?

    Da kann ich selbst(auch) noch lernen, falls du mir das erklärst...
     
    #3
  4. IRC-Bridge
    Offline

    IRC-Bridge

    Registriert seit:
    14. Dezember 2015
    Beiträge:
    17
    Dafür, dass Du von Dir selber behauptest 100% PHP-Skills zu haben ist dieses "Script" mehr als Mangelhaft.

    Wie bereits angesprochen hat dies nichts im geringsten mit OOP zu tun, sondern viel mehr einfach Code in eine Methode geworfen...

    die() in einem solchen "Bibliothek" (wenn man das so nennen darf) zu verwenden ist absolut falsch; wie @ShareLock bereits angesprochen hat sollten man da lieber auf Exceptions setzten...
     
    #4
  5. jensIO
    Offline

    jensIO

    Registriert seit:
    28. Juli 2015
    Beiträge:
    602
    Ort:
    Internet, im Neuland
    Minecraft:
    jens1o
    Okey.

    Danke für dein Feedback...
    1. Ja, ich war mal wieder zu selbst verliebt... änder ich mal demnächst.
    2. Hab das Argument mal gelöscht.
    3. Ich werde den Code nachher bearbeiten wenn ich am Computer sitze.
    4. Gut, dann weiß ich jetzt wo ich den try-catch Block setzen soll.
     
    #5
  6. IRC-Bridge
    Offline

    IRC-Bridge

    Registriert seit:
    14. Dezember 2015
    Beiträge:
    17
    Ok du scheinst nicht verstanden zu haben worauf ich und ShareLock hinaus wollten...

    Es geht nicht darum die Exceptions zu fangen, sondern vielmehr welche zu werfen, anstelle einfach den PHP Interpreter zu beenden.

    Ich war mal sofrei und habe dein "Skript" leicht abgeändert, um mal zu zeigen was damit gemeint war (Wieder Kommentare (und/oder Getter/Setter u.ä.) einführen lasse ich mal als Hausaufgabe..)

    PHP:
    1. <?php
    2. class PHPVotifier {
    3.     protected $server;
    4.     protected $port;
    5.     protected $publicKey;
    6.  
    7.     function __constructor($server, $port, $key) {
    8.         $this->server = $server;
    9.         $this->port = $port;
    10.         $this->publicKey = $key;
    11.     }
    12.  
    13.     public function vote($username) {
    14.         $votetext = $this->getVoteText($username, $_SERVER["REMOTE_ADDR"]);
    15.    
    16.         $leftover = (256 - strlen($votetext)) / 2;
    17.    
    18.         while ($leftover > 0) {
    19.             $votetext .= "\x0";
    20.             $leftover--;
    21.         }
    22.         //    Öffentlicher Key vorbereiten...
    23.         $key = $this->getPublicKey();
    24.    
    25.         openssl_public_encrypt($votetext, $encrypted, $key);
    26.         $socket = fsockopen($server_ip, $server_port, $errno, $errstr, 2);
    27.    
    28.         if(!$socket) {
    29.             throw new Exception($errstr);
    30.         }
    31.    
    32.         fwrite($socket, $encrypted);
    33.         fclose($socket);
    34.         return true;
    35.     }
    36.  
    37.     protected function getVoteText($username, $adress) {
    38.         return "VOTE\n" . "jens-hausdorf.de\n" . $username ."\n" . $adress . "\n" . time() . "\n";
    39.     }
    40.  
    41.     public function getPublicKey() {
    42.         $key = wordwrap($this->key, 65, "\n", true);
    43.         return "-----BEGIN PUBLIC KEY-----\n" . $key . "\n-----END PUBLIC KEY-----";
    44.     }
    45. }
    exit() in einem solchen Skript zu verwenden ist genau so falsch wie die(), da es einfach alles beendet und dem Nutzer eines solchen Skriptes komplett verbietet den Fehler selbst zu behandeln.
    Schon mal daran gedacht, dass Nutzer evtl. nicht einfach das Skript komplett beenden wollen, wenn etwas schiefgeht, sondern vllt auch noch eine Alternative Vote-Logik (evtl. den Vote später nochmal versenden, etc.) implementieren wollen.

    Genau dafür sind Exceptions, damit Nutzer selber Fehler in der Programm Ausführung behandeln können...

    Achja.. wenn man einen socket öffnet, dann sollte man ihn auch schließen ;)

    Warum dies notwendig ist, sollte klar sein, ist aber auch eine potentielle Sicherheitslücke:

    Vielleicht ist es zur Zeit keine Sicherheitslücke, aber kleine Modifikationen an deinem Code in der Zukunft könnten evtl. dazu führen... Better safe than sorry
     
    #6
    Glumandala gefällt das.
Status des Themas:
Es sind keine weiteren Antworten möglich.