1 PHP & MySQL gevorderd2 Inhoudsopgave Inleiding! 4 Voorkennis voor PHP & SQL! 4 Database resources! 4 De werking van een PHP-module op een webserver!...
Inleiding Deze handleiding is een vervolg op basis en gevorderde PHP. De focus ligt volledig op de koppeling tussen PHP en een MySQL- database. Onderwerpen die aanbod komen zijn: hoe gegevens uit een MySQL-database gehaald kunnen worden, toegevoegd, geupdate en andere bewerkingen.
De derde PHP-handleidingen geven een goede basis voor het toepassen van PHP met de juiste gereedschappen om zelf meer functionaliteit aan een website toe te voegen. Het vinden van de juiste, simpele en eenduidige code voor een behoefte blijft een combi van: zelf bedenken of vinden in ander (online) handleidingen of forums. Na de twee beschikbare handleidingen en de juiste drive, zal het zeker moeten lukken :-)
Voorkennis voor PHP & SQL Ervaring hebben met inzicht in het volgende moeten hebben: · · · ·
HTML-code (en of XHTM). Gebruik en installatie van een webservers en een databases (bijv: Apache als web-server, MySQL als database of gecombineerd in: XAMPP of MAMP) Basiskennis van PHP. Basis SQL-statements (query- syntax en database begrippen)
Database resources Om de PHP-code die in deze handleiding gebruikt word toe te passen is een database nodig. De eenvoudigste manier om dit te doen is door XAMPP of MAMP te installeren. Activeer naast Apache ook MySQL en maak hierin een database aan die benaderbaar is. De databasenaam moet bekend zijn, een gebruikersnaam en wachtwoord met uitsluitend de rechten die nodig zijn om de gewenste acties uit te kunnen voeren.
Zie meer informatie hierover; zie materiaal over databases op ‘kerssies64.net’. Hier zijn ook exports te vinden van databases, die geïmporteerd kunnen worden in een eigen gemaakte database, waarna deze te gebruiken zijn om de gebruikte voorbeelden in deze handleiding uit te voeren uit te voeren.
Door zelf databases met tabellen en content op te zetten wordt deze vaardigheid uiteraard verbeterd!
De werking van een PHP-module op een webserver Ter opfrissing; PHP is een module die aan de server-kant werkt. De client krijgt uiteindelijk pure HTML-code toegestuurd waarmee een page wordt weergegeven. Hoe deze page tot stand is voor de client onzichtbaar.
Hieronder staan wat gebeurt er als een php-webpagina wordt opvraagt door een client:
1. Aan de client zijde wordt een verzoek gedaan naar een (php)webpagina op een bepaalde webserver, bijvoorbeeld: www.kerssies64.net
client
7. De ontvangen code wordt ontvangen door de client. In de browser wordt deze omgezet in een leesbare pagina
2. De webserver zoekt deze pagina op in z’n filesysteem.
6. Het resultaat van de php-module wordt samengevoegd met eventueel aanwezige html-code. Deze code wordt door de webserver verstuurd naar de client
3. Omdat het een .php pagina is, stuurt de webserver deze pagina naar de php-module. Deze module moet op de webserver zijn geïnstalleerd 4. De php-module benaderd een database en voert hierop acties uit en geeft evt waarden terug
database
webserver
.php
5. De php-module voert het phpscript uit en geeft het resultaat terug aan de webserver
Bij het maken van uitgebreidere websites wordt al snel duidelijk dat het overzicht al snel zoek is. Bij pure HTML-websites alleen al kan het overzicht zoek raken. De eerste stap ter verbetering is regels afbreken en vaker enteren. Door gebruik te maken van tabs, wordt het overzicht nog beter. Zeker wanneer er consequent wordt ingesprongen per tag en een tab wordt terug genomen wanneer deze wordt gesloten. Een uitkomst is het scheiden van opmaak en html-code, wat met CSS gebeurt. Dit scheiden en overzichtelijk houden van code wordt steeds belangrijker. Zo kunnen bepaalde delen met includes in andere documenten worden gezet. Sessies moeten als eerste worden opgezet, en zo meer. Hieronder is een grafische weergave gegeven, als advies, hoe een phpdocument opgebouwd kan worden: titel browser-tab link favicon.ico META voor "description" META voor "keywords" link CSS-bestand tbv opmaak HTML document opbouw en weergeven formulieren en content, evt dmv PHP-echo’s
MySQL is het populairste open-source databasesystemen, omdat deze database vrij te installeren en te gebruiken is, stabiel is en een goede ondersteuning heeft. De MySQL database wordt zeer vaak gebruikt in combinatie met PHP. De gegevens die in MySQL worden opgeslagen in tabellen. Een tabel is verzameling van ingevoerde gegevens die bestaan uit kolommen en rijen. Elke rij is een unieke set informatie die is opgebouwd uit meerdere kolomen elk met specifieke gegevens. De databases zijn handig voor het opslaan van informatie in categorieën. Een bedrijf zou een database kunnen hebben met de volgende tabellen: “Werknemers”, “Producten”, “Klanten” en “Orders”.
Het beveiligen van phpMyAdmin
Tijdens de ontwikkeling van een website met daaronder een MySQL-database is het handig om de testomgeving op het locale-systeem te beveiligen. Als dit niet wordt gedaan, dan kan iedereen binnen het lokale-netwerk (LAN) de database benaderen en daarin wijzigingen maken. Dit komt door: Het beheer van de database gebeurt namelijk altijd met phpMyAdmin phpMyAdmin heeft een standaard login en geen wachtwoord Netwerk scanners kunnen up IP-adres vinden en zien dat er een webserver actief is en de database benaderen. (http:///phpmyadmin , ) De phpMyAdmin beveiligen kan als volgt: Maak een nieuwe gebruiker aan bij ‘Rechten’ en geef die volledige toegang (ALL PRIVILEGES) Open config.inc.php in de XAMPP-map Zoek de volgende regels, of voeg ze toe: $cfg['blowfish_secret'] = $cfg['PmaAbsoluteUri'] = $cfg['Servers'][$i]['auth_type'] = $cfg['Servers'][$i]['user'] = $cfg['Servers'][$i]['password'] = $cfg['Servers'][$i]['AllowNoPassword'] =
De opbouw van een database Een database bevat altijd één, maar mestal meerdere tabellen. Elke tabel moet en naam hebben (b.v. “Klanten” of “Orders”). De tabellen bevatten records (rijen) met gegevens. Hieronder is een voorbeeld van een tabel genoemd “Personen”: ID
achternaam
1
Pietersen
2
Kracht
4
Steijn
tussenv van
voornaam
adres
hnr
plaats
Hans
Doorweg
100
Zwolle
Jip
Straatlaan
3
Zwolle
Janneke
Hobbelpad
28
Amersfoort
De tabel bevat hierboven drie records (voor elke contactpersoon) zijn zes kolommen (AchterNaam, Tussen, VoorNaam, Adres, Nummer en Stad). Meer over de opbouw en constructie van databases is te vinden in de kerssies64.net readers ”databases en SQL”, of andere (online) handleidingen.
PHP koppelen met een Database Het maken van een koppeling met een database is de minimale vereiste om met PHP (of een andere taal) bewerkingen uit te voeren of vragen aan een database te stellen. In PHP, wordt de koppeling tussen het PHP- script en de database gedaan met de mysql_connect () functie. Syntaxis mysql_connect (servernaam, gebruikersbenaming, wachtwoord); Parameter
Beschrijving
servernaam
Optioneel; Specificeert de server om te verbinden met. De standaard waarde is “localhost: 3306” Optioneel; Specificeert de gebruikersbenaming om het programma te openen. De standaardwaarde is de gebruiker die rechten heeft op het serverproces Optioneel; Specificeert het wachtwoord om in te loggen op de database. Standaard is: “” .
login wachtwoord
Tip: Er zijn meer beschikbare parameters, maar de hierboven vermelde zijn het belangrijkst. Voor meer details wordt verwezen naar andere (online) materiaal.
Het is verstandig meerdere gebruikers op de database aan te maken, zodat afhankelijk van de ingelogde gebruiker gespecificeerde database rechten beschikbaar komen. Bijvoorbeeld: · · · ·
een administrator met alle rechten een administrator met alle rechten als reserve (wordt allen in nood gebruikt) een hoofdgebruiker waarmee online beheer op de database wordt uitgevoerd gebruiker(s) met beperkte rechten die afhankelijk van hun profiel gespecificeerde rechten op de database hebben
De kerssies64.net site bevat enkele geëxporteerde tabellen die in een eigen database geïmporteerd kunnen worden, waarna de PHP-script code direct uitgevoerd kan worden. Let op dat de server, de databasenaam, het login en wachtwoord anders kunnen zijn...
Voorbeeld:
In het volgende voorbeeld slaat de koppeling in een variabele ($con) voor recenter gebruik in het script op. Het “die” gedeelte zal worden uitgevoerd als de koppeling niet opgebouwd kan worden:
//verbinding wordt gesloten met de database ?>
Bij de servernaam wordt hier “localhost” gebruikt, maar dit is afhankelijk van de servernaam waarop de database is opgestart. In plaats van een naam kan er ook een IP-adres worden gebruikt. “Localhost” heeft altijd IP-adres 127.0.0.1, dit werkt gewoon. Net als elke ander IP-adres waar een server met database actief is, mits de poorten in de firewall open staan ;-). Een koppeling met een database zal automatisch worden gesloten wanneer het script beëindigt. Om de koppeling eerder te sluiten, gebruik dan de mysql_close () functie.
Een query is een vraag of een verzoek om gegevens uit een database. Met MySQL, kunnen specifieke gegevens worden opgevraagd en een recordset met gewenste informatie terug geven. Een voorbeeld van een simpele SQL- query: SELECT AchterNaam FROM Gebruikers
De vraag selecteert hierboven alle gegevens in de kolom “AchterNaam” uit de tabel “Gebruikers” en kan een recordset zoals hieronder terug geven: AchterNaam Moes Blijvers Zetters Syntaxis SELECTEER kolom_naam FROM tabel_naam
Om PHP het SQL- statement uit te laten voeren is de functie: mysql_query () nodig. Deze functie wordt gebruikt om een query of een opdracht naar een MySQL- koppeling te verzenden. Voorbeeld: '; mysql_select_db('PHPsql', $con); //selecteerd de database $resultaat = mysql_query("SELECT * FROM Gebruikers"); //zet query resultaat in een PHP-array
while($row = mysql_fetch_array($resultaat)) { echo $row["VoorNaam"] . " " . $row["AchterNaam"]; echo ' '; //voor elke record in de php-array wordt een regel gemaakt. }
Het voorbeeld slaat hierboven de gegevens op die door de functie mysql_query () zijn teruggekeerd in de variabele $resultaat. Daarna wordt mysql_fetch_array () functie gebruikt om de eerste rij van recordset als een array terug te geven. Elke vraag aan mysql_fetch_array () geeft de volgende rij in recordset. De whileloop loop door alle records in recordset om de waarden van elke rij te printen. Hiervoor wordt de $row variabele gebruikt: $row [“FirstName”] en: $row [“AchterNaam”]. Op het scherm wordt als uitkomst weergegeven: connectie opgebouwd Hans Pietersen Jip Kracht Janneke Steijn
Natuurlijk kunnen de gegevens ook in een HTML- tabel worden weergegeven. Zie hiervoor PHPbasis materiaal van kerssies64.net.
TIP: Zet alle queries in één bestand en geef elke query een eigen variabele. Doormiddel van een include per web- page zijn alle variabelen queries beschikbaar. Bij wijzigingen in de database staan alle query bij elkaar, dit is makkelijker te beheren. TIP: Echo uit te voeren queries en probeer deze uit direct in de MySQL- database. Zo is het eenvoudig te controleren of een query wel correct is uitgewerkt.
Invoegen van records Het INSERT INTOTO statement wordt gebruikt om nieuwe records aan een tabel toe te voegen in een aangegeven tabel.
Syntaxis
Het is mogelijk om het INSERT INTO statement op twee manieren te gebruiken. De eerste vorm specificeert niet de kolomnamen waarin de gegevens worden geplaatst, dus alleen de waarden worden genoemd in de juiste kolomvolgorde: INSERT INTO tabel_naam VALUES (Waarde1, Waarde2, Waarde3,…)
De waarden worden ook op de zelfde volgorde in de kolommen geplaatst, deze vorm van invoeren wordt veel gebruikt wanneer altijd alle kolommen een waarde moeten hebben.
De tweede vorm specificeert zowel de op te nemen kolomnamen als de waarden: INSERT INTO tabel_naam (kolom1, kolom2, kolom4,…) VALUES (Waarde1, Waarde2, waarde4,…)
Om PHP deze sql- statements uit te laten voeren moet de mysql_query () functie gebruiken worden. Voorbeeld:
Formuliergegevens toevoegen aan een Database Doormiddel van een HTML –formulier worden de kolommen van een nieuw record gevult. Daarnaast wordt één veld gevuld door middel van ‘autoincrement’ van MySQL en één veld wordt gevuld met een waarde uit een variabele. Het HTML-formulier:
Invoegen Gebruiker
Het bestand “invoegen.php” verbindt zich met een server en daarna met een database. De mysql_query () functie bevat een variabele met daarin het INSERT INTO statement, en zal de gegevens uit het formulier toevoegen. Hier is de pagina “invoegen.php”:
Voer gegevens in '; mysql_select_db ('PHPsql', $con); // PHPsql is de naam van de MySQL-database echo 'OK, de database is geselecteerd '; $MemberDatum = date("y-m-d"); // datum wanneer een gebruiker is toegevoegd. echo 'Waarde nieuw record '.$MemberDatum.' ';
PHP & MySQL gevorderd // ID in de tabel is 'autoincrement' en wordt automatisch door MySQL opgehoogd. $sql = "INSERT INTO Gebruikers (MemberDatum, AchterNaam, Tussen, VoorNaam, Adres, HuisNr, Plaats) VALUES ('$MemberDatum','$_POST[AchterNaam]', '$_POST[Tussen]', '$_POST[VoorNaam]', '$_POST[Adres]', '$_POST[HuisNr]', '$_POST[Plaats]')"; mysql_query ($sql,$con); // Tabelnaam en alle genoemde kolom-namen waarin de waarden vervolgens worden geplaatst if (! $con) { echo "error"; } else { echo "1 record toegevoegd"; } mysql_close ($con); ?>
Query met WHERE en gegevens uit meerdere tabellen Syntax SELECT kolom(en) FROM tabel_naam WHERE kolom(en) en operator waarde AND tabel1.kolom-x = tabel2.kolom-x
Voorbeeld:
WHERE VoorNaam= ‘Hans’ AND Gebruikers.ID = Login.ID”; $resultaat = mysql_query($sql)
ORDER BY statement Syntax SELECT kolom(en) FROM tabel_naam ORDER BY kolom(en) ASC|DESC
WHERE Plaats = 'Zwolle' ORDER BY AchterNaam DESC”; $resultaat = mysql_query($sql); while($row = mysql_fetch_array($resultaat)) { echo $row['AchterNaam'] . " " . $row[VoorNaam]; echo " "; } ?>
Update van records De statement UPDATE wordt gebruikt om gegevens in een record van een tabel te wijzigen. Syntaxis UPDATE tabel_naam UPDATE kolom1=VALUES, kolom2=VALUES2,… WHERE een_kolom=een_VALUES
Tip: Merk op dat de WHERE clausule in de syntaxis bij het UPDATE statement. WHERE specificeert welk record moeten worden bijgewerkt. Wordt de WHERE weglaten, dan zullen alle records worden bijgewerkt! Voorbeeld:
Het volgende voorbeeld werkt sommige gegevens in de tabel van “Personen bij”: $con = mysql_connect ("localhost", "login", "ww"); if (! $con) { die ('kon niet verbinden: '. mysql_error ()); } mysql_select_db ("PHPsql", $con); mysql_query ("UPDATE Gebruikers SET Plaats = 'Groningen' WHERE VoorNaam = 'Hans' AND AchterNaam = 'Pietersen'"); echo 'update van record uitgevoerd'; mysql_close ($con); ?>
Verwijderen van records Het DELETE statement wordt gebruikt om records uit een tabel te verwijderen. Syntaxis DELETE FROM tabel_naam WHERE enkele_ kolom= enkele_WAARDEN
Tip: Merk op dat de WHERE clausule in de syntaxis bij het DELETE statement. WHERE specificeert welk record moeten worden verwijdert. Wordt WHERE weglaten, dan zullen alle records worden verwijdert! Het volgende voorbeeld verwijdert alle records in de tabel van “Gebruikers” waar AchterNaam “Pietersen” is: $con = mysql_connect ("localhost", "test", "test"); if (! $con) { die ("kon niet verbinden: ". mysql_error ()); } mysql_select_db ("PHPsql", $con); mysql_query ("DELETE FROM Gebruikers WHERE AchterNaam='Pietersen'"); echo "record verwijderd " mysql_close ($con); ?>
Meer PHP functies voor MySQL bewerkingen (engelse uitleg) Functie
Beschrijving
mysql_affected_rows()
mysql_close()
Returns the number of affected rows in the previous MySQL operation Deprecated. Changes the user of the current MySQL connection Returns the name of the character set for the current connection Closes a non-persistent MySQL connection
mysql_connect()
Opens a non-persistent MySQL connection
mysql_create_db()
Deprecated. Creates a new MySQL database. Use mysql_query() instead Moves the record pointer
Returns a database name from a call to mysql_list_dbs() Deprecated. Sends a MySQL query. Use mysql_select_db() and mysql_query() instead Deprecated. Deletes a MySQL database. Use mysql_query() instead Returns the error number of the last MySQL operation Returns the error description of the last MySQL operation Deprecated. Escapes a string for use in a mysql_query. Use mysql_real_escape_string() instead Returns a row from a recordset as an associative array and/or a numeric array Returns a row from a recordset as an associative array Returns column info from a recordset as an object
mysql_fetch_object()
Returns the length of the contents of each field in a result row Returns a row from a recordset as an object
mysql_fetch_row()
Returns a row from a recordset as a numeric array
mysql_field_flags() mysql_field_len()
Returns the flags associated with a field in a recordset Returns the maximum length of a field in a recordset
mysql_field_name()
Returns the name of a field in a recordset
mysql_field_seek()
Moves the result pointer to a specified field
mysql_field_table()
Returns the name of the table the specified field is in
mysql_field_type()
Returns the type of a field in a recordset
mysql_free_result()
Free result memory
mysql_get_client_info()
Returns MySQL client info
mysql_get_host_info()
Returns MySQL host info
mysql_get_proto_info()
Returns MySQL protocol info
mysql_get_server_info()
Returns MySQL server info
mysql_info()
Returns information about the last query
mysql_insert_id()
Returns the AUTO_INCREMENT ID generated from the previous INSERT operation
Deprecated. Lists MySQL table fields. Use mysql_query() instead Lists MySQL processes
mysql_list_processes()
mysql_num_fields()
Deprecated. Lists tables in a MySQL database. Use mysql_query() instead Returns the number of fields in a recordset
mysql_num_rows()
Returns the number of rows in a recordset
mysql_pconnect()
Opens a persistent MySQL connection
mysql_ping() mysql_query()
Pings a server connection or reconnects if there is no connection Executes a query on a MySQL database
mysql_real_escape_string()
Escapes a string for use in SQL statements
mysql_result()
Returns the value of a field in a recordset
mysql_select_db()
Sets the active MySQL database
mysql_stat()
Returns the current system status of the MySQL server Deprecated. Returns the table name of field. Use mysql_query() instead Returns the current thread ID
Executes a query on a MySQL database (without fetching / buffering the result)
20
PHP & MySQL gevorderd
PHP security Beveiliging van de database is erg belangrijk, er staan namelijk allerlei belangrijke gegevens in zoals: gebruikersnamen, wachtwoorden, adresgegevens, mail- adressen, rekeningnummers/ creditcardnummers, etc.
Wachtwoord onleesbaar voor database- administrators Met dit onderdeel worden enkele mogelijkheden getoond waarmee gegevens geverifieerd kunnen worden of worden versleuteling worden opgeslagen in de database. Een database- administrator heeft dan wel toegang tot de database, maar kan gegevens niet lezen, zoals bijvoorbeeld een wachtwoord. Zo is het mogelijk strings en bestanden te coderen. Maar ook om aangeboden bestanden te controleren of ze wel een origineel zijn van de aanbieder. Encryptie mogelijkheden zijn: Functie
Beschrijving
crc32()
crc32(string) Berekend een 32-bit CRC (cyclisch redundantie checksum) voor een string crypt(string,moeilijkheid) de moeilijkheid is standaard 1, de hoger het cijfer, de moeilijker te kraken str_rot13(string) Het coderen met ROT13 verplaatst elke karakter 13 plaatsen in het alfabet. De numerieke en nietalfabetische karakters blijft staan. sha1(string,raw) sha1 op een string
crypt() str_rot13()
sha1()
Optie: Specifcaties voor hex of binary output formaat: • TRUE - exacte 20 character binary format • FALSE - standaard. 40 character hex number sha1_file()
md5()
md5_file()
sha1_file(bestand,raw) Sha1 op een bestand. $bestand = "voorbeeld.txt"; $sha1B = sha1_file($bestand); md5(string,raw) Berekend de MD5 hash van een string Optie: • TRUE - Raw 16 karakter binary formaat • FALSE - Standaard. 32 karakter hex nummer md5_file(file,raw) Berekend de MD5 hash van een bestand
Het resultaat, de verschillen liggen in de speciale tekens in een string: zonder %u: -1712303409 met %u: 2582663887
MD5 toegepast op een string:
Het MD5 resultaat: 8b1a9953c4611296a827abf8c47804d7
Door gebruik te maken van encryptie kunnen gegevens gecodeerd worden bewaard in een tekstbestand of database. Gebruikers en (sub)beheerders kunnen dan gevoelige informatie, zoals wachtwoorden of privé gevoelige data, niet zomaar lezen...
Het resultaat op basis van het operating systeem kan zijn: Standard DES: 8kGC9cr6g59Sg Extended DES: s65gP10pQ3tSs MD5 wordt niet ondersteund. Blowfish DES wordt niet ondersteund.
Validatie op invoervelden. Lege invoervelden of incorrecte gegevens in een formulier zorgen ervoor dat er vervuiling van de database ontstaat. Door de ingevoerde gegevens aan een bepaalde opmaak te controleren wordt ervoor gezorgd dat alleen de juiste informatie in een query wordt gezet.
De functie preg_match is hierbij erg handig. Wanneer de validatie van de voornaam niet klopt, dan wordt er een uitroepteken voor het invoerveld geplaatst. Dit staat in een tabel-cel zodat de uitlijning met eventuele regels daaronder intact blijft... Tevens wordt er de variabele $v_fouten opgehoogd als er een incorrecte validatie is waargenomen. Deze variabele kan weer worden gebruikt .... code ....
{
echo '!';
$v_fouten = $v_fouten+1;
} ?> ... meer code ... echo 'het aantal validatie fouten bij de invoer is: '. $v_fouten; if(isset($_POST[bewaar]) && $v_fouten != 0 )
De validatie kan nog beter met look-forward en look-backward optiesin preg_match.
Capcha (no-robot invoer beveiliging) Om te voorkomen dat robot’s ofwel computers allerlei combinaties los laten op invoervelden kan een capcha worden. Er wordt een willekeurige code ( aantal cijfers, letters of een combinatie) gegenereerd die de gebruiker moet intypen voordat hij verder mag. Grbruik van capcha’s worden vaak gebruikt bij: · ·
Vanaf een website e-mail versturen naar een gebruiker Een nieuw wachtwoord aanvragen
Op het internet zijn gratis code-blokken te vinden die hier geschikt voor zijn. De kunst is om een gewenste uitvoervorm te vinden die tevens eenvoudig is in te voegen tussen de bestaande code.
IP- highjacking Bij IP-highjacking maakt een hacker gebruik van sessie gegevens van een ingelogde gebruiker. Wat echter (meestal) ongelijk is is het IP-adres waarvandaan een hacker toegang verschaft tot de site. Door het IP-adres bij het inloggen in een sessie te zetten en deze te controleren met het IP-adres van de gebruiker die een web-page opend kan dit worden voorkomen. actie bij het inloggen:
$_SESSION['remoteIPlogin'] = $_SERVER['REMOTE_ADDR']; // eerder opgeslagen ip gebruiker (normaal moeten deze waarde tijdens inloggen worden ingesteld)
acties bij het openen van elke webpage (evt met een include toegoegen):
ini_set(display_errors, 0); // error niet weergegeven --> fout opnieuw sessie starten
Invoerveld beveiligingen tegen sql-injections. Bij capcha’s is al aanbod gekomen dat invoervelden een zwak punt zijn van een website met daar achter een database. Het is handig om de volgende tips in ieder geval op te volgen: Maximaliseer het aantal in te voeren karakters invoervelden door ‘maxlength’ te gebruiken.
Ook is het mogelijk om gebruik te maken van zogenaamde “sql injections”, hierbij wordt er in een invoerveld code geplaatst waardoor er een stukje script tussen het originele script wordt gezet. De ‘geposte’ waarden (met code) worden in een query naar de database gestuurd en uitgevoerd. Het gevolg kan zijn dat er een query wordt uitgevoerd die gegevens of delen van de database bloot geeft. Gebruik daarvoor een escape-string, deze haal slahes, punt-komma’s en andere programmeercode karakters uit de geposte string. (oa / en ; ), waardoor de sql-injection zijn noodzakelijke karakters verliest. $wachtwoord
In sessie kunnen gegevens worden opgeslagen die later worden gebruikt in de web-site. Hiervoor moet helemaal in het begin wan een php-page het volgende stukje code staan. :
session_start();
Als er een web-pagina wordt geopend zonder deze functie, dan vervalt de sessie.
Sessie beveiliging Door gebruik te maken van de sessies kan er een nieuw soort beveiliging worden toegepast op web-pages. Zonder deze techniek heeft inloggen geen enkele zin.Door in de browser-historie halen URL’s te benaderen of gewoon URL’s te proberen kan een gebruiker web-pages benaderen die niet gezien mogen worden, hoewel de link niet wordt weergegeven in een van de publiekelijk te benaderen webpages.
Acties die per webpage ingesteld moeten zijn of worden:
ini_set(display_errors, 0); // error niet weergegeven --> fout opnieuw sessie starten
Valt het profiel buiten de toegestane waarden of is het level om een web-page te zien hoger dan het profiel dat is ingelogd, dan wordt een andere web-page weergegeven. if ($pass != 0 && $pass != 1 && $pass != 2 && $pass != 3)
{
// voorkomt doorlaten van webpages door het intypen van URL's in de adresbalk van de browser
// beveiliging: Lege profiel variabelen proberen pages te openen zonder in te loggen
Sessie-tijd Wanneer een gebruiker is ingelogd en wegloopt bij zijn website, dan kunnen onbevoegden gebruikmaken van functionaliteiten waartoe ze geen rechten hebben. Door een sessietijd in te stellen op de webserver of met php-code aan de site toe te voegen, zal de site na een ingestelde tijd uitloggen en de index-pagina weergeven. $aantal_min = 1; //minuten instellen $inactief = 60 * $aantal_min; // aantal minuten in seconden $nu = time(); $sessie_duur = $nu - $_SESSION['timeout']; echo 'sessie duur: '.$session_duur.' '; echo 'sessie: '.time().' - '.$_SESSION['timeout'].' = '.$sessie_duur.' '; echo 'inactief: '.$inactief.' seconden ';*/ // sessietijd als idle-tijd te lang is if(isset($_SESSION['timeout']) )
{
$sessie_duur = time() - $_SESSION['timeout'];
if($sessie_duur > $inactief)
{
session_destroy();
header("Location: sessietijdverkopen.html");
} //
}
Webpage
Onderaan de webpage wordt de huidige tijd (laatste actie) opnieuw in een sessie gezet: // huidige tijd in de sessie zetten $_SESSION['timeout']=time();
Basis tekst e-mail verzenden Met PHP is het mogelijk berichten via mail te versturen. Dit kan alleen als de webserver ook een maildienst (SMTP) heeft draaien. Een eenvoudig script om te mailen: ini_set ( 'SMTP' , ''smtp_server'');
Hier volgt de body van het mail bericht. Type gewoon enkele regels tekst, eventueel met daarin variabelen verwerkt. '.$mail_bericht['mailbody1'].' mvg, kerssies64.net ‘; $headers = 'From: beheerder <'.$array['mailadres'].'>';
mail($to,$subject,$txt,$headers);
Uiteraard moet het e-mail adres waarnaar verstuur wordt kloppen, dit hoeft echter niet voor het mailadres waarvan het verstuurd wordt. Bedenk wel spammen is strafbaar!!! Denk bij e-mail adressen waar je vanaf verstuurd ook aan: [email protected] of [email protected]
Een HTML-mail verzenden Wanneer een simpele mail met PHP verstuurd kan worden is het vrij eenvoudig om er een HTMLmailtje van de maken. Er worden de header krijgt andere inhoud en de boodschap bevat HTMLtags en opmaak. Hieronder is een simpel voorbeeld weergegeven: html-mail " . $newLine; $to = $_POST[email]; $subject = "Test mail"; $message = ''; $message .= '
src="http://www.backups.nl/images/windows%20mail.png" />'; $message .= 'Hallo, Bedankt voor uw reactie. Uw gegevens zijn bewaard. '; $message .= 'groet, de Beheerder';
Een HTML-mail verzenden met een attachment Een werkende HTML-mailer kan eenvoudig worden uitgebouwd. Het voorbeeld hieronder upload bestanden naar een vaste map, waarna deze worden toegevoegd aan een HTML-mailtje. ook is er een prioriteiten veld aan toegevoegd. html-mail + att > uploaden bestand naar map "upload" $targetfolder = "attachments/"; //uploadfolder bepalen (pad) $targetfolder = $targetfolder .basename( $_FILES['uploaded']['name']); $uploaded_size = filesize($_FILES['uploaded']['size']); $uploaded_type = filesize($_FILES['uploaded']['type']); $ok=1; // >> beperkingen uploads $max_mb = 5000; if (isset($_POST[upload]) && $uploaded_size > $max_mb) { // beperk bestands grootte
echo "Het bestand is groter dan ".($maxMB/1000).
"MB Upload een kleiner bestand ";
$ok=0; } if (isset($_POST[upload]) && $uploaded_type == "text/php") // pregmatch op extentie { //Beperk het soort bestanden
echo "Het bestand voldoet niet aan de voorwaarden"; } else { //Er is voldaan aan upload-voorwaarden -> uploaden bestand if(move_uploaded_file($_FILES['uploaded']['tmp_name'], $targetfolder))
{
echo "Het bestand ". basename( $_FILES['uploadedfile']['name']). " is geupload naar de map";
PHP & MySQL gevorderd //Bekijk eerst de bronversie van een ontvangen e-mail in je mail-applicatie (mail-format) if (isset($_POST[zend])) { $newLine = PHP_EOL; //"\r\n"
$separator = md5(time());
$prioriteit = $_POST['prioriteit']; // 1 of 0
$to
= $_POST[email];
$subject = "Test mail";
$headers .= "From: blabla ".$newLine;
if ($prioriteit == 1)
{
$headers .="X-Priority: 1" . $newLine.
"Priority: Urgent" . $newLine.
"Importance: high" . $newLine; // basis = 0 - Normal - normal
Toepassingen Toepassing1: SQL – database koppeling Het koppelen met een database wordt gedaan bij het laden van een website. Het opbouwen moet zo veilig mogelijk op de server staan. Als de toegang tot de database beschikbaar komt voor derden, dan liggen alle gegevens ‘op straat’. Zet dit bij voorkeur in de private_html map van je webserver en include deze code in de site. $host = 'localhost'; $username = "user_db"; $password = "wachtwoord_db"; $database = "db_naam"; $con = mysql_connect($host, $username, $password); if (!$con) {
die('Geen connectie gemaakt met DB: ' . mysql_error()); } else {
//connectie met database maken
mysql_select_db($database, $con); } ?>
Toepassing2: SQL – toevoegen van een tupel in een database Na connectie met de database wordt er na het klikken van de knop ‘invoegen’ worden de acoountgegevens uit het formulier toegevoegd in de tabel. include("../private_html/site/db_connect.php"); $q_invoegen_account = “INSERT INTO tabel_account VALUES (email, voornaam, tussenv, achternaam, adres, hnr, plaats)”; if (isset($_POST[invoegen]) && $invoerfouten == 0)
{ // uitvoeren na klik invoegen
mysql_query($q_invoegen_account);
} … meer code, waarin een formulier zit met knop om de velden als nieuwe gebruiker toe te voegen
Toepassing3: SQL – opvragen en beheren database gegevens Een query die alle account gegevens uit een database haalt en in een tabel weergeeft. Alle gegevens worden in een formulier weergegeven, zodat de gebruiker dit kan aanpassen en updaten. Met een formulier daaronder kan het record worden verwijdert. Elke regel met de gegevens van een account heeft een eigen achtergrondkleur. Dit kan met CSS worden gedaan (er is geen css-uitwerking meegeleverd). Ook bevat elke regel een bewerk- en verwijder-knop. Na 2 includes,staat er acties die uitgevoerd worden mist die knop is geklikt (viewaccounts.php): include("../private_html/site/db_connect.php"); include(“../private_html/site/queries.php”); if (isset($_POST[Ja]))
{ // uitvoeren na klik op ja-knop
mysql_query("START TRANSACTION;"); // transactie
mysql_query($delete_aankopen_account);
mysql_query($delete_gegevens_account);
mysql_query($delete_account);
mysql_query("COMMIT;");
} if (isset($_POST[update]))
{ // uitvoeren na klik op update-knop
mysql_query($update_account);
} if (isset($_POST[verwijder]) )
{ // Delete Ja/Nee -keuze; alleen weergeven wanneer er is geklikt op delete
echo'
';
}
Query om accounts op te vragen wordt uitgevoerd en een tabel wordt opgezet.
$accountszoeken
= mysql_query($zoekaccount_q);
$lijn = 0; // variabele achtergrondkleuren per regel
echo '
';
De regels met accounts wordt weergegeven door een while-loop: while ($gevondenaccounts = mysql_fetch_array($accountszoeken))
{
$accID = $gevondenaccounts['u_id'];
$lijn ++;
echo '
echo '>'; // CSS-class ‘even’ en ‘odd’ elk met een eigen achtergrond-kleur
echo '
'; // het email-account maakt een gebruiker uniek en is de sleutel in de database echo '
Het email-adres is een sleutel die nodig is om de juiste regel te overschrijven in de database. Wanneer deze wordt gewijzigd in een formulier, moet het originele email-adres nog wel beschikbaar zijn (onzichtbaar). Controleer ook of het nieuwe adres al niet bekend is in de database. Anders zijn er twee gebruikers met het zelfde email-adres en zijn de gebruikers niet meer uniek.
echo '
value ="'.$gevondenaccounts['email'].'" SIZE="20" MAXLENGTH="25">
'; echo '
<SELECT NAME="aanhef">
{echo " SELECTED ";} echo' >dhr
{echo " SELECTED ";} echo' >mevr
'; echo '
value ="'.$gevondenaccounts['v_naam'].'" SIZE="12" MAXLENGTH="25">
';
echo '
value ="'.$gevondenaccounts['tussenv'].'" SIZE="4" MAXLENGTH="7">
';
echo '
value ="'.$gevondenaccounts['adres'].'" SIZE="21" MAXLENGTH="25">
'; echo '
value ="'.$gevondenaccounts['hnr'].'" SIZE="3" MAXLENGTH="4">
'; echo '
value ="'.$gevondenaccounts['plaats'].'" SIZE="15" MAXLENGTH="15"> ';
echo’
value="update">
’;
echo’
value = "'.$gevondenaccounts['email'].'" SIZE="25" MAXLENGTH="25">
’;
echo '
value ="'.$gevondenaccounts['a_naam'].'" SIZE="20" MAXLENGTH="30">';
Door de queries in een appart bestand te zetten, hier: queries.php, wordt de PHP-code overzichtelijker. Het beheer over de queries is hiermee ook vereenvoudigd, doordat de queries niet meer verspreid staan in en over verschillende php-documenten.
= '".$aanhef."',
v_naam
= '".$_POST[voornaam]."',
tussenv
= '".$_POST[tussenv]."',
a_naam
= '".$_POST[achternaam]."',
adres
= '".$_POST[adres]."',
hnr
= '".$_POST[hnr]."',
plaats
= '".$_POST[plaats]."',
email
= '".$_POST[email]."',
WHERE `email` = '".$ORGmail."' ";
$delete_account = "DELETE FROM `tabel_account` WHERE email = '".$_POST[delete_account]."' "; ?>
Toepassing4: update tabelvelden vanuit een VIEW Hieronder is een methode weergegeven hoe een view gemaakt wordt en hoe er daarna een update op de view wordt gedaan. Het is namelijk niet mogelijk een update uit te voeren over meerdere tabellen in één keer. Het maken van een view: CREATE VIEW blabla AS SELECT r.* FROM `tabel1` r, `tabel2` a WHERE a.idaccount = r.idaccount AND r.veldX= 'waarde1' AND a.veldY='waarde2'
Daarna de update (die hier bestaat uit één veld): UPDATE blabla SET [veldX]= 'nieuwe waarde'