PHP is een van de meest populaire programmeertalen voor internet. Soms kan een functievriendelijke taal de programmeur te veel helpen, en gaten in de beveiliging kunnen binnensluipen, waardoor wegversperringen in het ontwikkelingspad worden gecreëerd. In deze zelfstudie bekijken we 5 tips om enkele veelvoorkomende valkuilen voor PHP-beveiliging en ontwikkelingsstoornissen te voorkomen.
Tijdens het ontwikkelingsproces is rapportage van applicatiefouten de jouwe
beste vriendin. Foutrapporten kunnen u helpen bij het vinden van spelfouten in uw
variabelen, detecteer onjuist functiegebruik en nog veel meer. Echter, een keer
de site gaat live dezelfde rapportage die een bondgenoot was tijdens
ontwikkeling kan verrader veranderen en uw gebruikers veel meer over uw vertellen
site dan u misschien wilt dat ze weten (de software die u uitvoert, uw map
structuur, enz.).
Zodra uw site live gaat, moet u ervoor zorgen dat alle fouten worden verborgen
rapportage. Dit kan gedaan worden door de volgende eenvoudige functie aan te roepen
bovenaan uw applicatiebestand (en).
error_reporting (0);
Als er iets misgaat, wil en wil je er nog steeds over weten
het. Daarom moet u altijd zorgen dat u uw fouten registreert in een
beveiligd bestand. Dit kan gedaan worden met de PHP-functie set_error_handler.
Vanaf het allereerste begin hebben de ontwerpers van PHP er altijd een paar bijgevoegd
functies om ontwikkeling gemakkelijker te maken. Of dat dachten ze! Enkele van deze
nuttige functies kunnen onbedoelde gevolgen hebben. Ik noem deze "slecht"
functies "omdat ze nachtmerries voor gegevensvalidatie en
creëerde een pad voor bugs om hun weg naar scripts te vinden. Een van de
de eerste dingen die je moet doen als het ontwikkelingsproces begint is
Schakel bepaalde van deze functies uit.
Opmerking: afhankelijk van uw host kunnen deze al dan niet uitgeschakeld zijn
u. Als u bezig bent met ontwikkelen op uw eigen computer of een andere vergelijkbare lokale computer
omgeving, zullen ze waarschijnlijk niet worden uitgeschakeld. Sommige van deze functies
zijn ook verwijderd in de komende PHP6, maar zijn alomtegenwoordig in PHP4
applicaties en worden alleen gedeprecieerd in PHP5-applicaties.
Register Globals (register_globals)
Kort gezegd, register_globals was bedoeld om een snelle toepassing te helpen
ontwikkeling. Neem bijvoorbeeld deze URL,
http: //yoursite.tld/index.php? var = 1, die een querystring bevat. De
register_globals verklaring staat ons toe om de waarde te benaderen met $ var
in plaats van $ _GET ['var'] automatisch. Dit klinkt misschien handig voor u,
maar helaas hebben alle variabelen in de code nu deze eigenschap, en
we kunnen nu gemakkelijk in PHP-applicaties komen die niet beschermen tegen
dit onbedoelde gevolg. Het volgende codefragment is er slechts één
veelvoorkomend voorbeeld dat u zult zien in PHP-scripts:
if (! empty ($ _POST ['gebruikersnaam']) && $ _POST ['gebruikersnaam'] == 'test' &&! empty ($ _POST ['wachtwoord']) && $ _POST ['wachtwoord'] == "test123 ") $ access = true;
Als de toepassing wordt uitgevoerd met register_globals ON, kan een gebruiker dit doen
plaats gewoon access = 1 in een querystring en zou er dan toegang toe hebben
ongeacht het script dat wordt uitgevoerd.
Helaas kunnen we register_globals niet van het script uitschakelen
kant (met ini_set, zoals we normaal zouden kunnen), maar we kunnen een
.htaccess-bestanden om dit te doen. Bij sommige hosts kunt u ook php.ini gebruiken
bestand op de server.
Uitschakelen met .htaccess
php_flag register_globals 0
Uitschakelen met php.ini
register_globals = Uit
Opmerking: als u een aangepast php.ini-bestand gebruikt dat niet van toepassing is op de
volledige server, moet u deze verklaringen opnemen in elke submap
dat heeft PHP.
Magic Quotes (magic_quotes_gpc, magic_quotes_runtime, magic_quotes_sybase)
Magic Quotes was een functie bedoeld om programmeurs de moeite van te besparen
addlashes () en andere soortgelijke beveiligingsfuncties gebruiken in hun code.
Er zijn ten minste drie problemen in verband met magische citaten. een
probleem met deze nuttige functie is als zowel magische aanhalingstekens en
addlashes () worden gebruikt. Als dit het geval is, dan krijg je uiteindelijk
meerdere schuine strepen worden toegevoegd, waardoor fouten worden veroorzaakt. Het tweede probleem is als
je maakt de aanname dat magische quotes aangezet zijn en dat is het ook
niet. Dan gaat alle invoer uit. Het derde probleem is die magie
quotes ontsnapt alleen enkele en dubbele aanhalingstekens, maar als u een gebruikt
database-engine, er zijn ook veel database-specifieke karakters die
moet ook worden ontsnapt. Het wordt aanbevolen om dit uit te schakelen
functie en gebruik in plaats daarvan de juiste variabele validatie (zie hieronder).
Helaas kunnen we geen magische aanhalingstekens uit het script uitschakelen
kant met behulp van ini_set. Net als bij register_globals kunnen we .htaccess of gebruiken
php.ini-bestanden om dit te doen.
Uitschakelen met .htaccess
php_flag magic_quotes_gpc 0 php_flag magic_quotes_runtime 0
Uitschakelen met php.ini
magic_quotes_gpc = Uit magic_quotes_runtime = Uit magic_quotes_sybase = Uit
Opmerking: als u een aangepast php.ini-bestand gebruikt dat niet van toepassing is op de
volledige server, moet u deze verklaringen opnemen in elke submap
dat heeft PHP.
Naast het ontsnappen van personages, nog een geweldige manier om te beschermen
invoer is om het te valideren. Met veel applicaties ben je eigenlijk al
weet wat voor soort gegevens u verwacht bij invoer. Dus de eenvoudigste manier
om jezelf te beschermen tegen aanvallen, is ervoor te zorgen dat je gebruikers dat alleen kunnen
voer de juiste gegevens in.
Stel bijvoorbeeld dat we een toepassing maken waarin gebruikers worden vermeld
verjaardagen en kunnen gebruikers hun eigen toevoegen. We zullen willen
accepteer een maand als een cijfer tussen 1-12, een dag tussen 1-31 en een jaar
in het formaat van JJJJ.
Het hebben van dit soort logica in uw applicatie is eenvoudig en regelmatig
expressies (regex) zijn de perfecte manier om invoervalidatie af te handelen.
Neem het volgende voorbeeld:
if (! preg_match ("/ ^ [0-9] 1,2 $ /", $ _GET ['month'])) // handle error if (! preg_match ("/ ^ [0-9] 1,2 $ / ", $ _GET ['day'])) // handle error if (! Preg_match (" / ^ [0-9] 4 $ / ", $ _GET ['jaar' ])) // handle error
In dit voorbeeld hebben we eenvoudigweg gecontroleerd (in de eerste twee if-instructies)
voor gehele getallen [0-9] met een lengte van een of twee 1,2 en we hebben de
hetzelfde in de derde if-verklaring, maar gecontroleerd voor een strikte lengte van 4
tekens 4.
In alle gevallen, als de gegevens niet overeenkomen met het formaat dat we willen, wij
retourneer een soort fout. Dit type validatie laat weinig over
ruimte voor elk type SQL-aanval.
Regex-expressies zoals die hierboven kunnen een beetje moeilijk zijn
in eerste instantie begrijpen, maar het uitleggen ervan valt buiten het bereik van dit
artikel. De php-handleiding heeft enkele extra bronnen om u te helpen met validatie. De PEAR-database heeft ook enkele pakketten, zoals het Validate-pakket om te helpen met e-mails, datums en URL's.
Hieronder staat een voorbeeld van het bovenstaande script in actie met 200 als invoer voor een maand, abc voor de dag en slechts 09 voor het jaar.
Een webtoepassing accepteert meestal invoer van gebruikers en geeft deze weer
in zekere zin. Dit kan natuurlijk in een grote verscheidenheid van vormen zijn
inclusief opmerkingen, discussielijnen of blogberichten in de vorm van HTML
code. Bij het accepteren van invoer, kan HTML gevaarlijk zijn,
omdat JavaScript wordt uitgevoerd op onbedoelde manieren.
Als zelfs één gat open blijft, kan JavasScript worden uitgevoerd en cookies
kan worden gekaapt. Deze cookiegegevens kunnen vervolgens worden gebruikt om een real te faken
account en geef een illegale gebruiker toegang tot de gegevens van de website.
Er zijn een paar manieren om jezelf tegen dergelijke aanvallen te beschermen. een
manier is om HTML helemaal niet toe te staan, omdat er dan geen mogelijkheid is
manier om JavaScript toe te staan om uit te voeren. Als u dit echter doet
formatteren is ook niet toegestaan, wat niet altijd een optie is voor forum
en blogsoftware.
Als u wilt dat HTML meestal wordt uitgeschakeld, maar toch eenvoudig wilt toestaan
opmaak, kunt u slechts een paar geselecteerde HTML-tags toestaan (zonder
attributen) zoals of . Of anders,
je kunt een populaire set tags toestaan met de naam "BBCode" of "BB Tags"
vaak te zien op forums in het formaat van [b] test [/ b]. Dit kan een zijn
perfecte manier om wat opmaakaanpassing mogelijk te maken zonder te weigeren
iets gevaarlijks. U kunt BBCode implementeren met behulp van reeds bestaande
pakketten zoals HTML_BBCodeParser of schrijf uw eigen BBCode-implementatie met reguliere expressies en een reeks preg_replace-instructies.
Last, but not least, is een van de meest bekende beveiligingsaanvallen
op het web: SQL-injectie. SQL-injectieaanvallen vinden plaats wanneer gegevens verloren gaan
niet aangevinkt en de toepassing ontkomt niet aan tekens die in SQL worden gebruikt
strings zoals enkele aanhalingstekens (') of dubbele aanhalingstekens (").
Als deze tekens niet worden uitgefilterd, kunnen gebruikers het systeem exploiteren door queries altijd waar te maken en zo aanmeldsystemen te misleiden.
Gelukkig biedt PHP een paar hulpmiddelen om je database te beschermen
invoer. Wanneer u bent verbonden met een sql-server, kunt u deze gebruiken
functies met een eenvoudige oproep, en uw variabelen moeten veilig zijn om te gebruiken
in zoekopdrachten. De meeste van de belangrijkste database-systemen aangeboden met PHP omvatten
deze beveiligingsfuncties.
Met MySQLi kunt u dit op twee manieren doen. Ofwel met de mysqli_real_escape_string-functie wanneer verbonden met een server:
$ username = mysqli_real_escape_string ($ GET ['gebruikersnaam']); mysql_query ("SELECT * FROM tbl_members WHERE gebruikersnaam = '". $ gebruikersnaam. "'");
Of met voorbereide verklaringen.
Voorbereide instructies zijn een methode om SQL-logica te scheiden van de gegevens die eraan worden doorgegeven. De functies die worden gebruikt in de MySQLi-bibliotheek filteren onze invoer voor ons wanneer we variabelen binden aan de voorbereide instructie. Dit kan zo worden gebruikt (wanneer verbonden met een server):
$ id = $ _GET ['id']; $ statement = $ connection-> prepare ("SELECT * FROM tbl_members WHERE id =?"); $ statement-> bind_param ("i", $ id); $ Statement> execute ();
Een ding om op te letten bij het gebruik van voorbereide instructies is de "i" in bind_param. ik staat voor integer maar u kunt s gebruiken voor string, d voor double en b voor blob, afhankelijk van welke gegevens we passeren.
Hoewel dit u in de meeste gevallen zal beschermen, zou u dat moeten doen
Houd nog steeds rekening met de juiste gegevensvalidatie zoals eerder vermeld.
Deze korte tutorial kan alleen het oppervlak van webbeveiliging krassen.
Uiteindelijk is het aan ontwikkelaars om ervoor te zorgen dat de applicaties die ze
bouwen is veilig door zichzelf te informeren over de gevaren van internet en
de meest voorkomende soorten kwetsbaarheden en aanvallen. Als je dat wilt
lees meer over beveiligingsproblemen in PHP, er is een gedeelte over beveiliging in de php-handleiding die eraan is gewijd.
Wat zijn jouw tips??