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!';
?>
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
$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 .'!';
?>
$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>
<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ß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
ß 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ßt du? <input type="text" name="name" value=""/></p>
<input type="submit" value="Absenden" />
</form>
</body>
</html>
<body>
<form action="tutorial.php" method="post">
<p>Wie heiß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ß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>'
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);
?>
$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.
$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