Lizenzsystem mit VB 2010, PHP und MySQLi

    • VB.NET

    Es gibt 81 Antworten in diesem Thema. Der letzte Beitrag () ist von Manawyrm.

      Lizenzsystem mit VB 2010, PHP und MySQLi

      Hallo,

      Mit diesem Tutorial erstellen sie mit VB 2010, PHP und MySQL ein Lizenzsystem.

      Sie benötigen:

      - Eine MySQL-Datenbank (bei fast jedem Hoster erhältlich)
      - Einen Webspace (für die PHP-Dateien)
      - Visual Basic 2010

      Als Erstes wird in der Datenbank eine Tabelle mit den Spalten

      license VARCHAR(150)
      program VARCHAR(100)
      used INT
      until VARCHAR(8)

      erstellt.

      Hier der SQL-Code zum Erstellen der Tabelle:

      SQL-Abfrage

      1. CREATE TABLE licensesystem ( license VARCHAR(150) NOT NULL ,
      2. program VARCHAR(100) NOT NULL ,
      3. used INT NULL ,
      4. until VARCHAR(8) NOT NULL ) ENGINE = MYISAM ;




      Als nächstes kann man mithilfe von PHP ein Formular erstellen, dass der Nutzer der Software ausfüllen muss, um einen Lizenzschlüssel zu erhalten.

      PHP-Quellcode

      1. <form action = "generate.php" method="post">
      2. Vorname:
      3. <br />
      4. <input type = "text" name = "vorname" />
      5. <br />
      6. Nachname:
      7. <br />
      8. <input type = "text" name = "nachname" />
      9. <br />
      10. <input type = "submit" value = "Lizenzschlüssel anfordern" />
      11. </form>



      Als nächstes wird eine PHP-Datei erstellt, die die Zugangsdaten für MySQL-Datenbank enthält:


      dbdaten.php:

      PHP-Quellcode

      1. define('server','euerdatenbankserver'); /* Normalerweise localhost */
      2. define('datenbank','euredatenbank');
      3. define('benutzername','euerbenutzername');
      4. define('passwort','euerpasswort');


      VORSICHT!: Sichere diese Datei mit einer .htaccess - Datei ab (im Verzeichnis 'sicher' ), dass keiner auf die sensiblen Daten außer die PHP-Scripts zugreifen können.


      Jetzt wird der Lizenzschlüssel generiert und in die Datenbank geschrieben:

      generate.php:

      Spoiler anzeigen


      PHP-Quellcode

      1. <?php
      2. require_once "sicher/dbdaten.php";
      3. $1str = substr($_POST["vorname"], 3) . rand(0,10);
      4. $2str = substr($_POST["nachname"], 3) . rand(0,10);
      5. $hash = $1str . $2str;
      6. $license = hash('sha256', $hash);
      7. $mysqli = new mysqli(datenbank,benutzername,passwort,server);
      8. if($mysqli->connect_error) {
      9. echo "Fehler bei der Verbindung:" . $mysqli_connect_error();
      10. exit();
      11. }
      12. $program = $mysqli->real_escape_string("IhrProgramm"); /* Geben sie ihren Programmennamen ein */
      13. $used = $mysqli->real_escape_string("0");
      14. $until = $mysqli->real_escape_string(date("d.m.Y",strtotime("+1 year")));
      15. if($stmt = $mysqli->prepare("INSERT INTO licensesystem (license,program,used,until) VALUES (?,?,?,?)")) {
      16. $stmt->bind_param("ssis", $license, $program, $used, $until);
      17. $stmt->execute();
      18. }
      19. if($stmt->affected_rows != 0) {
      20. echo "Ihr Lizenzschlüssel:";
      21. echo "<br />";
      22. echo htmlspecialchars($license); echo "<br />";echo "Gültig bis: " . htmlspecialchars($unti)l;
      23. } else {
      24. echo "Er ist ein Fehler aufgetreten.";
      25. }
      26. $stmt->close();
      27. $mysqli->close();







      Jetzt wird eine PHP-Datei erstellt, die den Lizenzschlüssel ausliest und überprüft.


      get.php


      Spoiler anzeigen


      PHP-Quellcode

      1. <?php
      2. require_once "sicher/dbdaten.php";
      3. if($mysqli->connect_error) {
      4. echo "Fehler bei der Verbindung:" . $mysqli_connect_error();
      5. exit();
      6. }
      7. $ergebnis = $mysqli->query("SELECT license,until FROM licensesystem WHERE used = '0'")
      8. while($result = $ergebnis->fetch_array()) {
      9. if $result['license'] = $_POST["license"] {
      10. if($update = $mysqli->prepare("UPDATE licensesystem SET used = '1' WHERE license = $_POST["license"]")) {
      11. echo "Erfolgreich";
      12. echo "Gültig: " . htmlspecialchars($result['until']);
      13. } else {
      14. echo "Fehlgeschlagen";
      15. } else {
      16. echo "Fehlgeschlagen";
      17. } }
      18. $ergebnis->close();
      19. $stmt->close();
      20. $update->close();
      21. $mysqli->close();
      22. ?>







      Jetzt kommt der Visual Basic-Teil :D:

      Spoiler anzeigen


      1.Schritt
      Jetzt öffnen Sie Visual Basic und öffnen (bsw. erstellen) Sie die Anwendung.

      Fügen Sie eine TextBox mit dem Namen Lizenzcode und
      einen Button mit dem Text "Lizenzschlüssel überprüfen" ein.

      Jetzt klicken Sie doppelt auf den Button.
      Fügen Sie das ganz oben ein

      VB.NET-Quellcode

      1. Imports System.Net, System.IO, System.Text

      Und fügen Sie diesen Code ein:

      VB.NET-Quellcode

      1. Dim License As String = Lizenzcode.Text
      2. ' Ersetzen sie unterhalb 'www.example.com' in ihre Adresse, wo sich die zuvor erstellten PHP-Dateien liegen
      3. Dim Request As HttpWebRequest = CType(WebRequest.Create("www.example.com/get.php"), HttpWebRequest)
      4. Request.Method = "POST"
      5. Request.ContentType = "application/x-www-form-urlencoded"
      6. Dim Post As String = "license=" & License 'POST-Data wird festgelegt
      7. Dim byteArray() As Byte = Encoding.UTF8.GetBytes(Post)
      8. Request.ContentLength = byteArray.Length
      9. Dim RequestStream As Stream = Request.GetRequestStream()
      10. RequestStream.Write(byteArray, 0, byteArray.Length) 'Schreibt den POST-Request in den Requeststream
      11. RequestStream.Close()
      12. Dim Response As HttpWebResponse = Request.GetResponse()
      13. RequestStream = Response.GetResponseStream()
      14. Dim reader As New StreamReader(RequestStream)
      15. Dim ServerResponse As String = reader.ReadToEnd() 'Liest den Quelltext aus
      16. reader.Close()
      17. RequestStream.Close()
      18. Response.Close()
      19. If InStr(ServerResponse, "Erfolgreich") Then 'Wenn im Quelltext des get.php 'Erfolgreich' steht
      20. Dim stringdate As String = ServerResponse.Substring(ServerResponse.IndexOf("Gültig :"), +8)
      21. Dim datum As Date = CDate(stringdate)
      22. Dim NowDate As Date = Now
      23. If datum < NowDate Then 'Wenn das Gültigkeitsdatum kleiner ist, als das jetzige Datum
      24. MessageBox.Show("Ihr Lizenzschlüssel ist abgelaufen")
      25. End
      26. ElseIf InStr(ServerResponse, "Fehlgeschlagen") Then 'Wenn im Quelltext des get.php 'Fehlgeschlagen' steht
      27. MessageBox.Show("Ungültiger Lizenzschlüssel")
      28. Else
      29. 'Was nach der Lizenzüberprüfung passiert. :-)
      30. End If
      31. End If



      Und jetzt haben Sie ein Lizenzsystem erstellt :D

      MFG

      alexwedwed :D

      EDIT: VB-Teil verbessert (Response durch Serverresponse ersetzt :D)
      PHP-Teil verbessert (real_escape_string eingesetzt)
      PHP: MySQL-Query funktioniert
      2 PHP-Syntaxfehler behoben
      VB-Teil auskommentiert :)

      Edit by hal2000:
      - Verschoben von Tutorials nach SCA (zu wenig Erklärung für ein Tutorial - kann nach Überarbeitung gerne wieder zurückverschoben werden).

      Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „Alex-Digital“ ()

      Erwähnte ich schon, dass mein echter Name ;DROP DATABASE; lautet? Kannst mich ja mal registrieren.

      -- Im Ernst: Bitte sei dir im klaren, dass hier veröffentlichter Code von vielen Menschen genutzt werden wird!
      In deinem Code sind elementare Sicherheits- und Logikfehler enthalten.

      Der VB.net Code ist unsauber und anfällig, die MySQL Querys werden nicht escapted.
      Alles in allem perfekte Vorraussetzungen um die Software/Datenbank zu zerstören.

      nikeee13 schrieb:



      Gruß,
      Manawyrm

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Manawyrm“ ()

      Manawyrm schrieb:

      Erwähnte ich schon, dass mein echter Name ;DROP DATABASE; lautet? Kannst mich ja mal registrieren.

      -- Im Ernst: Bitte sei dir im klaren, dass hier veröffentlichter Code von vielen Menschen genutzt werden wird!
      In deinem Code sind elementare Sicherheits- und Logikfehler enthalten.


      Sicherheitsfehler sehe ich keine! Er nutzt PHP Data Objects (PDO), da werden die Eingaben über $mysqli->bindParam() automatisch escaped!

      Leider ist das PHP-Skript nicht sauber geschrieben, bei großen Projekten kann das schnell zum Verhängnis werden(insbesondere bei PHP).
      Irgentwie haut das nicht hin :I

      Parse error: syntax error, unexpected '{' in /var/customers/webs/ni59645_1/lizenzneu/generate.php on line 15

      und wieso steht eigentlich im PHP Quell Code das

      INSERT INTO licensesystem (license,program,used,until) VALUES (?,?,?,?)

      Wozu die ? , könnte mir jemadn helfen :I
      die , trennen zeilen von zeilen und werte von werte

      Genau wie wenn du schreibst 1,2,3,4 usw is mehr oder weniger das gleiche


      *EDIT*
      Verlesen.
      Ich nehme an das du dort deine Values eintragen musst

      Bei mir Haut das mit der SQL Abfrage nicht hin
      #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''license' VARCHAR(150) NOT NULL , 'program' VARCHAR(100) NOT NULL , 'used' I' at line 2
      Parse error: syntax error, unexpected T_WHILE in /users/wtfal/www/get.php on line 8

      Parse error: syntax error, unexpected T_LNUMBER, expecting T_VARIABLE or '$' in /users/wtfal/www/generate.php on line 3

      Kann jemand die Fehler beheben ?

      popel schrieb:

      Parse error: syntax error, unexpected T_WHILE in /users/wtfal/www/get.php on line 8

      $ergebnis = $mysqli->query("SELECT license,until FROM licensesystem WHERE used = '0'")

      Da fehlt ein ";" am Ende.

      popel schrieb:

      Parse error: syntax error, unexpected T_LNUMBER, expecting T_VARIABLE or '$' in /users/wtfal/www/generate.php on line 3

      require_once "sicher/dbdaten.php";

      Müsste "require_once("sicher/dbdaten.php");" sein...
      Also habe noch (als PHP-Programmierer) folgende Tipps:

      Wie schon gesagt wurde (desswegen Zitat) diesen Code bzw. diese Funktion benutzen:

      Manawyrm schrieb:

      Bitte auf anständiges Escapen per mysql_real_escape_string() achten!
      Und zusätzlich alle Daten, die in und aus der Datenbank kommen mit:

      htmlspecialchars($text) bzw. htmlentinities($text) bearbeiten, dabei ist $text der übergebene Text!

      Das macht es viel viel sicherer ;)
      Ich krieg trotzdem bei der SQL Abfrage sowas
      #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''license' VARCHAR(150) NOT NULL , 'program' VARCHAR(100) NOT NULL , 'used' I' at line 2
      Bei mir ging das dann nur so

      SQL-Abfrage

      1. CREATE TABLE licensesystem ( license VARCHAR(150) NOT NULL ,
      2. program VARCHAR(100) NOT NULL ,
      3. used INT NULL ,
      4. until VARCHAR(8) NOT NULL ) ENGINE = MYISAM ;

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „michi6666“ ()

      Also ich bekomme weder Fehler noch wird irgendetwas in die DB geschrieben.
      Weißt du warum?


      EDIT: ja gut soweit geht nun....aber bekomme auch:

      Parse error: syntax error, unexpected '{' in /var/www/web46/html/lizenz/generate.php on line 15


      in line 15 steht:
      if($stmt = $mysqli->prepare("INSERT INTO licensesystem (license,program,used,until) VALUES (?,?,?,?)") {


      MFG
      GOOGLE ist mein Meister :)

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Bady“ ()