• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

[PHP] Votifier Server Script/Socket Script

Status
Für weitere Antworten geschlossen.

jens1o

Workaholic
Registriert
28 Juli 2015
Beiträge
644
Alter
23
Diamanten
254
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:
<?php

// Hier einfügen(vor der nächsten Zeile) oder direkt das Script mit 'require_once "votifier.php";' einbinden
$voteobjekt = new PHPVotifier();
// Server-IP/Domain(String), Port(Int)(Standard: 8199), Username(String), Public Key(String) [evt. von MySQL laden]
$voteobjekt->vote("localhost", 8199, "jens1o", "******Public Key******");

?>
einbinden.

Der Code:
PHP:
<?php

class PHPVotifier {

        public function vote($server_ip, $server_port, $username, $public_key) {
                // Informationen zum Vote:
                //   1 = Serverliste
                //   2 = Username(von dem der gevotet hat)
                //   3 = IP Addresse(Identifizierung)
                //   4 = Zeit des Votes
                $votetext = "VOTE\n" . "jens-hausdorf.de\n" . $username ."\n" . $_SERVER["REMOTE_ADDR"] . "\n" . time() . "\n";
      
                //  Ups? Da fehlen noch Bytes! Damit
                //  die Anfrage nur 256 Bytes groß ist(wichtig!):
                //  Wieviel fehlen noch?
                $leftover = (256 - strlen($votetext)) / 2;
      
                //  Restliche Bytes dazu packen(als x0/NULL)
                while ($leftover > 0) {
                        $votetext .= "\x0";
                        $leftover--;
                }
      
                //    Öffentlicher Key vorbereiten...
                $key = wordwrap($public_key, 65, "\n", true);
                $key = "-----BEGIN PUBLIC KEY-----\n" . $key . "\n-----END PUBLIC KEY-----";
       
                //   Key encodieren/standalone Version mit OpenSSL
                //     (sollte vorinstalliert sein bei Hostern eurer Wahl)
                // falls nicht, kann nachinstalliert werden.        
            
            
               try {
                    openssl_public_encrypt($votetext, $encrypted, $key);
                } catch(Exception $e) {

                    exit("Fehler! " . $e->getMessage());

                 }
      
                //  Verbindung mit Server aufbauen
                //    TIMEOUT 2 SEKUNDEN -> Check: ok?
                $socket = fsockopen($server_ip, $server_port, $errno, $errstr, 2);
                if(!$socket) {
                        exit("Error: " . $errstr);
                } else {
                        echo "Yooo/alles ok";
                }
      
                // SEND DAT PACKAGE... Have fun :D
                // Fertig! Der Rest macht der Server
                fwrite($socket, $encrypted);
      
                return true;
        }

}
?>

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


Edit:
Anmerkungen umgesetzt. Danke an jedes Feedback!
 
Zuletzt bearbeitet:

jens1o

Workaholic
Registriert
28 Juli 2015
Beiträge
644
Alter
23
Diamanten
254
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...
 

IRC-Bridge

Minecrafter
Registriert
14 Dezember 2015
Beiträge
17
Diamanten
300
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...
 

jens1o

Workaholic
Registriert
28 Juli 2015
Beiträge
644
Alter
23
Diamanten
254
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.
 

IRC-Bridge

Minecrafter
Registriert
14 Dezember 2015
Beiträge
17
Diamanten
300
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:
<?php
class PHPVotifier {
    protected $server;
    protected $port;
    protected $publicKey;

    function __constructor($server, $port, $key) {
        $this->server = $server;
        $this->port = $port;
        $this->publicKey = $key;
    }

    public function vote($username) {
        $votetext = $this->getVoteText($username, $_SERVER["REMOTE_ADDR"]);
   
        $leftover = (256 - strlen($votetext)) / 2;
   
        while ($leftover > 0) {
            $votetext .= "\x0";
            $leftover--;
        }
        //    Öffentlicher Key vorbereiten...
        $key = $this->getPublicKey();
   
        openssl_public_encrypt($votetext, $encrypted, $key);
        $socket = fsockopen($server_ip, $server_port, $errno, $errstr, 2);
   
        if(!$socket) {
            throw new Exception($errstr);
        }
   
        fwrite($socket, $encrypted);
        fclose($socket);
        return true;
    }

    protected function getVoteText($username, $adress) {
        return "VOTE\n" . "jens-hausdorf.de\n" . $username ."\n" . $adress . "\n" . time() . "\n";
    }

    public function getPublicKey() {
        $key = wordwrap($this->key, 65, "\n", true);
        return "-----BEGIN PUBLIC KEY-----\n" . $key . "\n-----END PUBLIC KEY-----";
    }
}

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
 
Zuletzt bearbeitet:
Status
Für weitere Antworten geschlossen.
Oben