Willkommen

Willkommen bei meinem kleinen Blog. Ich spiele seit 2009 EVE Online und werde hier meinen werdegang immer weiter veröffentlichen. Zusätzlich versuche ich immer wieder auch generelle Diskussionen und Änderungen zu besprechen.

PHP 4 Eve

Da mein Internet zu Hause momentan nicht wirklich zum Spielen zu gebrauchen ist, bin ich momentan dabei zusammen mit der deutschen Community auf Eveger ein kleines Tutorial für PHP in Bezug auf die EVE-API zu schreiben

Inhaltsverzeichnis:
  • Punkt 1: Was brauche ich?
  • Punkt 2: Wie fange ich an?
  • Punkt 3: Was ist eigentlich dieses PHP?
  • Punkt 4: Hallo Welt!
  • Punkt 5: Variablen
  • Punkt 6: Daten an andere Seiten weiterleiten
  • Punkt 7: Unser erster Kontakt mit der Eve-Api
  • Punkt 8: Sicherheit geht vor!
  • Punkt 9: Von der ItemID zum Itemnamen

Punkt 1: Was brauche ich?

Zuerst braucht ihr mal das JDK (Java Development Kit), dieses braucht ihr später um den Editor und den Webserver den ich euch ans Herz legen würde zu benutzen. Anschließend brauchen wir einen eigenen Server den wir als Webserver benutzen können, hierfür eigenet sich Xampp super, da dieser von Haus aus PHP unterstützt. Und zuguter letzt brauchen wir noch Aptana, den Editor von dem ich vorhin sprach.
Installation am besten auch in der Reihenfolge, erst JDK, dann Xampp, dann Aptana.


Punkt 2: Wie fange ich an?

Zuerst startet ihr das Xampp Benutzerpanel und klickt bei "Tomcat" auf "start", dies Startet euren Webserver, zur Kontroller könnt ihr einmal euren Browser öffnen und "localhost/" (ohne ") eingeben, Ihr solltet nun auf der Seite von Xampp landen, nutzt die gelegenheit um gleich mal auf der linken Seite auf "phpinfo()" zu klicken, wenn euch diese Seite angezeigt wird, funktioniert auch PHP richtig, herzlichen Glückwunsch, du hast nun deinen eigenen Webserver den du auf deinem PC (nicht öffentlich) benutzen kannst.
Als nächstes starten wir mal Aptana, habt ihr dies getan, fragt euch Aptana nach einem Workspace, diesen Pfad könnt ihr so lassen, anschließen versucht er GIT einzurichten, ich weiß nicht was es ist, aber es dauert auch nicht so lange. Sucht anschließend auf der linken Seite den Reiter "Projekt-Explorer", wählt ihn aus und sucht euren Xampp-Installationspfad (standard C:\xampp\), öffnet den Ordner mit dem kleinen + vor dem Ordnernamen. Hier müsstet ihr einen Ordner "htdocs" haben, rechtklickt diesen ordner und wählt "New from Template -> PHP -> PHP-Template", gebt dieser Datei den Namen "tutorial.php".
Die Datei sollte nun folgendermaßen aussehen:
<?php

?>
Ist dies der Fall können wir anfangen uns ein bisschen genauer mit diesem PHP zu beschäftigen.


Punkt 3: Was ist eigentlich dieses PHP?

PHP steht für "„PHP: Hypertext Preprocessor" und kommt häufig bei dynamischen (sich veränderndern) Internetseite vor, bekannte Beispiele sind Facebook und Youtube. Warum sollte ich PHP lernen? Wenn man eine eigene Internetseite mit Daten aus EVE-Online betreiben möchte und dabei an den User angepasste Informationen anzeigen möchte bietet sich PHP an, da es (meiner bisherigen Meinung nach) leicht zu lernen ist und für seine einfachheit (im Vergleich zu anderen Sprachen) sehr mächtig ist.

Punkt 4: Hallo Welt!

Unspecktakulär aber für viele Personen die mit der Programmierung anfangen immernoch das erste Programm in jeder Sprache ist das sogenannte "Hello-World-Programm", ziel dieses Programms ist es, einfach nur "Hello World!" auszugeben.
In PHP gestalltet dieses sich sehr einfach.
Hierzu brauchen wir erstmal einen Befehl mit dem wir etwas ausgeben können, der übliche Befehl hierfür in PHP ist "echo", wir schreiben also:
echo Hallo Welt!
Nein, nein, nein, schön wärs, aber ganz so einfach ist die Programmierung nicht :)
Bei PHP müssen wir die Zeichenkette (auch String genannt, merkt euch das schonmal) in Anführungszeichen (") oder Hochkomma (') geschrieben. Der Unterschied hierbei liegt im Detail. Vorerst tun beide das gleiche, wenn wir aber Sonderzeichen, besonders Anführungszeichen oder HTML-Befehle in den Text schreiben wollen bekommen wir Probleme. Ich bevorzuge das Hochkomma und benutze nur in ausnahmefällen die Anführungszeichen, das ist aber geschmackssache. Kommen wir nun also zurück zu unserem "echo", mit unserem neu erworbenen Wissen sind wir uns nun sicher, dass es so aussehen muss:
echo 'Hallo Welt!';
Das Semikolon am Ende "sagt" PHP, das hier der Befehl zuende ist, man sollte also nach jeder Zeile ein Semikolon schreiben, sonst könnte PHP probleme bekommen :D
Nun speichern wir unsere Datei und öffnen den Browser, hier geben wir nun in die Adresszeile "localhost/tutorial.php" ein, wenn eure Datei anders heißt, nehmt den Namen.
Was sehen wir nun auf der Internetseite? Nun, wenn ihr alles richtig gemacht habt "Hello World!", wenn nicht, schaut einfach mal nach ob eure Datei so aussieht:
<?php
echo '
Hallo Welt!';
?>

Punkt 5: Variablen

Wie in jeder anderen Programmiersprache die ich kenne, gibt es auch in PHP Variablen, Variablen sind Werte die unter einem bestimmten Namen gespeichert werden und die im gesamten Programm benutzt werden können (kleiner Tipp hierbei von mir, definiert sie oben im Quellcode). In PHP werden Variablen wie folgt deklariert (erstellt)
$name = "Gossi";
Mit dieser Zeile wird eine Variable mit dem Namen "name" und dem Wert "Gossi" erstellt. Ich persöhnlich bennene meine Variablen immer im sogenannten Camel-Case, bedeutet kleinen Anfang und dann nach diesem Prinzip:
$armor
$schild
$schiffsName
$anzahlWaffen
Variablen müssen in PHP mit einem Buchstaben oder einem Unterstrich beginnen, Sonderzeichen und Leerzeichen sind nicht erlaubt.
Widmen wir uns nun wieder unserem "Hello World"-Programm von vorhin und erweitern es mal mit einer Variable.
Anstelle von "Hallo Welt!" wollen wir nun "Hallo" und einen Namen anzeigen und da wir das mit normalen Zeichenketten ja bereits können, machen wir das ganze über Variablen.
Wir schreiben also in unser Programm über dem echo noch schnell:
$name = "";
In die Anführungszeichen könnt ihr nun natürlich schreiben was immer ihr wollt, nur keine Anführungszeichen oder Backslashes (\) wollt ihr eins dieser beiden Zeichen verwenden, müsst ihr sie vorher "entwerten", da sie in PHP eine eigene Bedeutung haben, wollt ihr also ein Anführungszeichen benutzen müsst ihr \" schreiben, für einen Backslash \\
Anschließend müssen wir uns noch darum kümmern, dass die Variable auch wirklich ausgegeben wird, hierzu schreiben wir unser echo um, aus
echo 'Hello World!';
wird
echo 'Hello ' .$name .'!';
Wofür nun also die Punkte? Ganz einfach, die Punkte bedeuten, dass die nachfolgende Zeichenkette oder Zahl an die vorherige angehangen werden soll.
Wenn wir nun speichern und unsere Internetseite neu aufrufen bekommen wir sowas:
Hallo Gossi!
Der Quellcode hierfür wäre dann:
<?php
$name = "Gossi";
echo 'Hallo ' .$name .'!';
?>


Punkt 6: Daten an andere Seiten weiterleiten

Kommen wir nun zu einem sehr wichtigen Abschnitt im Internet, wie gebe ich vom Benutzer eingegebene Daten an mein Programm weiter?
Hierzu werden wir eine "tutorial.html" Datei anlegen und in dieser den Benutzer bitten einen Namen einzugeben, so können wir jeden Menschen auf dieser Welt grüßen ohne ständig den Code umzuschreiben :)
Zuerst brauchen wir hierfür eine HTML-Datei, dazu rechtsklicken wir wieder den "htdocs" Ordner auf der linken Seite von Aptana und wählen: "New -> File" diese Datei nennen wir dann "tutorials.html". Wenn wir diese leere Datei haben müssen wir noch ein Grundgerüst für HTML erstellen, hierzu schrieben wir folgendes:
<html>
<body>

</body>
</html>
Mit dem HTML-Tag (<html>) öffnen wir den Teil den der Browser verarbeitet, mit dem Body-Tag öffnen wir den Rumpf der Internetseite, hier kommen die Inhalte der Seite hinein.
Und am Ende schließen wir die Tags wieder in umgekehrter Reihenfolge wie wir sie geöffnet haben.
Wenn wir die Seite nun öffnen würden, würden wir nur eine weiße Seite sehen, deshalb müssen wir noch die Eingabefelder und einen Button zum Absenden der Daten einbauen.
Damit wir aber die Daten die der User eingibt weiterleiten können müssen wir zuerst ein Formular definieren, dies geschieht in HTML so:
<form action="tutorial.php" method="post"></form>
Was macht nun also action und wofür zum Teufel steht "method="post""?
Mit dem action Attribut geben wir der Form vor auf welche Seite wir die Daten weiterleiten wollen. Mit method geben wir an, ob in der Adressleiste des Browsers die Daten zu sehen sein sollen, die der Benutzer eingegeben hat. Hier gibt es nur 2 möglichkeiten, "post" oder "get". Bei get werden die Eingaben in der Adresszeile des Browsers angezeigt, bei "post" nicht, dies kann in unterschiedlichen Fällen sinnvoll sein oder nicht, ich benutze jedoch lieber post, da ansonsten maximal 1024 Zeichen übergeben werden können, reicht zwar meistens, aber ich mags nicht, wenn meine ganze Adresszeile voll ist ;)
Und zwischen diese Form-Tags kommen nun noch ein Textfeld und ein Button zum abschicken der Daten, das könnte dann so aussehen:
<p>Wie hei&szlig;t du? <input type ="text" name="name" value="" /></p>
Gehen wir das mal stück für Stück durch:
<p> Leitet einen Absatz ein, nicht zwingen erforderlich, aber hilft mir bei der Übersicht
&szlig; Ist nichts anderes als ein ß, schreibt aber ruhig mal ß anstelle dieses Batzens und schauts euch an
<input.... Öffnen ein Element zur Interaktion mit dem User
type="text" Gibt an, dass es sich um ein Textfeld handelt
name="name" Setzt den Namen des Elements über den wir es später abfragen können
value="" Hier könnten wir einen vorgefertigten Wert eintragen
/> schließt das Input-Element
Und zum Schluss brauchen wir in der HTML-Datei noch einen Button zum senden, hierzu nehmen wir folgendes:
<input type="submit" value="absenden" />
Nun sollte unsere HTML-Datei so aussehen:
<html>
<body>
<form action="tutorial.php" method="post">
<p>Wie hei&szlig;t du? <input type="text" name="name" value=""/></p>
<input type="submit" value="Absenden" />
</form>
</body>
</html>

Machen wir also mit unserer PHP-Datei weiter, die Variable können wir eigentlich löschen, wir benötigen sie nicht mehr. Wenn wir uns (wie ich oben) für "method="post"" entscheiden müssen wir um die Daten aus der URL auszulesen folgendes Konstrukt benutzen:
$_POST['name'];
Wenn wir nun unser echo also folgendermaßen umschreiben bekommen wir das gewünschte Ergebnis:
echo 'Hallo ' .$_POST['name'] .'!';
Nun öffnen wir im Browser die Adresse "localhost/tutorial.html", geben einen Namen ein, drücken auf Absenden und lassen uns von unserem Server grüßen.


Punkt 7: Unser erster Kontakt mit der Eve-Api

Wer es noch nicht getan haben sollte, muss an diesem Punkt erstmal openssl installieren, sonst kann PHP nicht auf die Eve-Api zugreifen, da diese mit HTTPS arbeitet, nach der Installation von openssl sollte man einmal den Tomcat server stoppen und in dem PFad:
"xampp\php" die Datei php.ini suchen, hier müssen, falls noch nicht geschehen, die folgenden 2 Zeilen eigefügt werden:

extension=php_openssl.dll
allow_url_include = On

Nun, ist dies geschehen und der Apache wurde wieder gestartet überlegen wir uns, was wir zuerst tun können. Da jede der Chargebundenen Abfragen die characterID benötigt, sollten wir vielleicht mal schauen, wie wir an diese rankommen und das möglichst bequem.
Hierzu schreiben wir in unserer tutorial.html die Zeile mit dem Textfeld etwas um (rein optisch):
<p>Wie hei&szlig;t dein Eve-Char? <input type="text" name="name" value=""/></p>
Anschließend wechseln wir wieder in unsere tutorial.php Datei und lesen den CharNamen aus der URL ein:
$charName = trim($_POST['name']);
Und zu guter letzt schauen wir welche Erweiterung wir brauchen um an die characterID zu bekommen, wenn man auf http://wiki.eve-id.net/APIv2_Page_Index nachschaut, findet man beim Punkt EVE die Erweiterung /eve/CharacterID.xml.aspx, es gibt noch eine bessere, aber die schauen wir uns später an.
Wie benutze ich das nun aber in PHP? Zuerst müssen wir eine Anfrage an den Server schicken, dieser gibt uns eine XML-Datei zurück, diese müssen wir dann so umwandeln, das wir mit ihr arbeiten können das machen wir so:
$charlist = simplexml_load_file('https://api.eveonline.com/eve/CharacterID.xml.aspx?names=' .$charName);
Da ich bereits rumgespielt habe, weiß ich wo ich die Info finde die ich bei dieser Abfrage bekomme:
echo $charName .' hat die CharacterID: ' .$charlist->result->rowset->row['characterID'];
Die Info ist in diesem Falle unter: result->rowset->row['characterID'] zu finden, aber woher habe ich das rausgefunden?
Das ist mal eine Denkaufgabe an euch, schaut euch die Ausgabe von folgendem Code an (einfach hinter das echo packen, also nächste Zeile) und versucht drauf zu kommen:
echo '<pre>';
print_r($charlist);
echo '</pre>'

Punkt 8: Sicherheit geht vor!

So, ich denke, zu diesem Thema sollte ich auch was schreiben bevor wir Anfangen mit etwas mehr Benutzereingaben zu arbeiten, denn diese geben dem User sehr viele Möglichkeiten, leider aber auch welche mit denen unser Programm unterwandert werden kann.
Zuerst wollen wir mal schauen was der User denn alles machen kann:

SQLInjection:
Dieses Thema betrifft uns wenn wir eine Datenbank haben, ein kleines Beispiel hierzu, wir prüfen ob jemand die korrekten Daten eingegeben hat um sich anzumelden, eine Möglichkeit dazu wäre das hier:
select * from web_user where username = :username and password = :password
Select: steht in SQL für “Selektieren”, oder einfach für “Wähle aus”
*: steht in diesem Fall für alle Daten
from web_user: bedeutet aus der Tabelle web_user
where: wo, also wo die Bedingungen zutreffen
username = :username: das erste username ist hier die DB-Spalte, das zweite mit dem Doppelpunkt davor für unseren Wert
and password = :password: und wo das Passwort aus der DB das gleiche wie das eingegebene ist.

Also bedeutet
select * from web_user where username = :username and password = :password
soviel wie:
Wähle alle Datensätze aus der Tabelle web_user aus, bei denen der username mit diesem usernamne übereinstimmt und das gespeicherte Password mit diesem Passwort.

Dies gibt aber leider den bösen Bursch die möglichkeit so was als Username anzugeben:
Gossi"; drop table „web_user“;--
Somit wird aus unsere Statement dieses hier:
select * from web_user where username = "Gossi";drop table web_user;--" and password = :password
Wird dieser Befehl ausgeführt bekommen wir ein Problem, unsere Tabelle web_user wird entfernt, mit allen vorhandenen Daten und die 2 Bindestriche am Ende Kommentieren den Rest des Befehls aus, somit wird der Befehl ausgeführt.

Schützen kann man sich dagegen, indem man dem Benutzer die Einschränkungen gibt, dass Sonderzeichen weder um Username, noch im Passwort erlaubt sind und das müssten wir dann entsprechend prüfen, umständlich, aber relativ sicher.

Eine einfache Möglichkeit hierfür wären:
ctype_digit(variable) und
ctype_alnum(variable)

Wenn diese True liefern, haben wir entweder nur Zahlen (digit) oder nur Zahlen und Buchstaben (alnum), Probleme bekommen wir hier jedoch mit Ä, Ö und Ü, sowie ß

Ein bessere Methode sich vor soetwas abzusichern (danke an Tacker) wenn man es nachher an die Datenbank weiterleitet ist
mysql_real_escape_string()
Diese Methode versieht Sonderzeichen (wie z.B. bei einem Eve-Namen ala Gos'si91) das Hochkomma mit einem "\", wir erinnern uns ans Thema entwerten, genau das passiert hier, für mehr infos zu "mysql_real_escape_string()" siehe hier

Crosscoding:
Crosscoding ist auch eine nette Geschichte, hierbei versucht der Hacker Befehle (meist in JavaScript) auf unserem Server auszuführen oder z.B. in einem Gästebuch zu hinterlassen, hiervor kann man sich auf die selbe Art schützen, wie vor einer SQLInjection.

Verändern der URL:
Was nützt uns die beste Prüfung, wenn die URL verändert werden kann? Oder stellen wir uns vor, jemand loggt sich auf einem anderen Rechner bei uns ein und der böse Bube speichert die URL mit allen Parametern die unser User übergeben hat. Wenn wir uns (und unsere User) davor schützen wollen, dass alleine über die URL der Seite bereits Daten geklaut werden können oder falsche Daten eingegeben werden können, sollten wir bei <form> in HTML die method=“post“ verwenden, hier werden die Parameter nicht über die URL übertragen.

Dies ist natürlich nicht alles wovor man sich schützen muss/sollte, aber es hilft schonmal die meisten Versuche abzuwehren.

Punkt 9: Von der ItemID zum Itemnamen.

Hier wird es schon etwas komplexer. Aktuell arbeite ich an einem Programm, welches die kompletten Corp-Assets ausliest und sie einem Gebäude zuordnet (Tower, Labor etc.), hier kommt man allerdings alleine mit der Eve-Api nicht wirklich weit, da man so nur die Item-ID bekommt. Was machen wir also jetzt, wenn wir die Itemnamen haben wollen? Ich habe hier den einfachsten Weg genommen und mir eine Datenbank aufgesetzt (geht bei Xampp ganz einfach) und habe hier eine Tabelle eingefügt namens eve_type.
Die Tabelle ist einfach aufgebaut und enthält nur 2 Spalten:
id name
438 1MN Afterburner II
439 1MN Afterburner I
In dieser Tabelle stehen natürlich nicht nur diese beiden Einträge, sondern für jedes Item in Eve ein eigener Eintrag. Den Dump dazu habe ich im Internet gefunden, leider weiß ich nicht mehr genau wo, er ist aber nicht so schwer zu finden.
Hier kommen wir nun zum Punkt PHP und SQL, genauer gesagt MySql. Ich empfehle hier an dieser Stelle vorerst eine "db.php" Datei zu erstellen. In dieser Datei speichern wir die Logindaten unserer MySql Datenbank, aber achtung, Sicherheit ist hier anders, solltet ihr also ein Programm schreiben welches ihr öffentlich Verfügbar macht, so wählt bitte einen anderen Weg.
db.php:
<?php
$dbname="Name der Datenbank";
$dbhost="Der Host (meist Localhost)";
$dbuser="Username";
$dbpass="Passwort";
mysql_connect($dbhost,$dbuser,$dbpass);
mysql_select_db($dbname);
?>
Diese Datei müssen wir nun in unsere php-Datei einbinden, dazu reicht ein einfaches include 'db.php'; am Anfang unserer Datei. Jetzt können wir auf die Datenbank zugreifen. Als erstes bauen wir uns einen String, also eine Text-Variable, die das SQL-Query beinhaltet, ein Query ist eine Abfrage, bzw. ein Befehl der an die Datenbank gerichtet wird.
$queryItem = 'select name from eve_type where id = ';
In diesem Fall erzeugen wir eine Variable mit dem Namen queryItem, in dieser speichern wir das Query. Mit dieser Abfrage selektieren wir den namen aus einer Zeile der Tabelle eve_type, bei  der die id einem später übergebenem Parameter entspricht. Wenn wir jetzt unsere ItemId aus der Eve-Api ausgelesen haben (dazu komme ich im nächsten Punkt), können wir sie mithilfe dieser Abfrage in den Itemnamen umwandeln. Wenn wir zum Beispiel als ItemId die Nummer 438 haben könnten wir jetzt folgendes ausführen in unserer PHP-Datei:
$resultItem = mysql_query($queryItem ."438");
$selectedLine = mysql_fetch_array($resultItem);
$itemName = $selectedLine['name'];
Mit diesen Zeilen machen wir aus unserer "438" dann "1MN Afterburner II". Damit wären wir fürs Erste auch wieder durch, ich hoffe ich konnte euch erneut einen kleinen Einblick geben. Im nächsten Abschnitt werde ich euch dann zeigen, wie ihr eure Assets auslesen könnt und mithilfe dieses Punktes anschließend eine Tabelle erstellt mit all euren Habseligkeiten.

Keine Kommentare:

Kommentar veröffentlichen