Een cruciaal onderdeel van de ontwikkelingspraktijk van PHP is altijd in het achterhoofd houden dat veiligheid niet iets is dat u eenvoudig in de winkel bij de hand kunt kopen. Het waarborgen van de beveiliging van uw webtoepassingen is een proces dat in de loop van de tijd voortdurend geëvalueerd, gecontroleerd en verhard moet worden.
Hoewel het gebruik van filters en het valideren van gegevens deel uitmaken van het beveiligingsproces, moet een webontwikkelaar beseffen dat randomisatie, obfuscatie en cryptografie in PHP een verschil kunnen maken in de beveiliging van webtoepassingen. Deze tutorial zal je door enkele eenvoudige technieken leiden bij het maken en gebruiken van willekeurige of unieke waarden in je webapplicaties, een kijkje nemen en enkele algemene obfuscation-technieken toepassen, en dieper ingaan op de wetenschap van cryptologie en het gebruik ervan binnen PHP.
Dictionary.com definieert randomisatie als:
"-verband: op willekeurige wijze bestellen of selecteren, zoals in een steekproef of experiment, vooral om vooroordelen en interferentie veroorzaakt door irrelevante variabelen te verminderen, maak willekeurig."
Het genereren van willekeurige nummers wordt op verschillende manieren bepaald, maar computationele generatoren voldoen niet aan de 'ware' willekeur zoals die te zien is in de natuur of elektronische ruis (het fuzzy, krijsende, zwart-witte kanaal op tv). Deze berekende waarden worden beschouwd als pseudo-willekeurig.
PHP biedt ons een aantal verschillende manieren om willekeurige waarden te maken. Laten we eens kijken naar enkele van de meer populaire functies.
De twee functies rand()
en MT_RAND ()
zijn waarschijnlijk de meest gebruikte functies om een reeks willekeurige getallen in PHP te genereren. De functie rand()
; is een oudere generator en valt uit gebruik als gevolg van MT_RAND ()
; die sneller en betrouwbaarder is en op sommige platforms een hogere maximale integerwaarde aankan. De functie str_shuffle ()
doet precies wat je zou verwachten, het schuifelt een reeks door.
"; print mt_rand (0, 20); // Voert een willekeurig geheel getal uit tussen 0 en 20 echo"
"; // Voorbeelden van rand () gebruik print rand (); // standaard echo"
"; printrand (0, 25); // Voert een willekeurig geheel getal uit tussen 0 en 25 echo"
"; // Voorbeeld van str_shuffle gebruik $ string = 'abcefghijklmnopqrstuvwxyz'; print str_shuffle ($ string); // shuffles $ string?>
De rand()
en MT_RAND ()
functies accepteren beide twee parameters waar $ min
is het laagste gehele getal om mee te beginnen, en $ max
zijnde het grootste gehele getal om mee te eindigen. De functie str_shuffle
neemt een parameter, een string, die een herverdeelde mutatie van de string uitvoert. Het werkt hetzelfde als wanneer je een spel kaarten schudt.
Terwijl mt_rand ();
spuwt een willekeurig geheel getal uit, en str_shuffle
zal een string mixen, een functie die veel wordt gebruikt om willekeurige unieke waarden te creëren uniqid ()
. Dit genereert een vooraf ingestelde unieke identificatie op basis van de huidige tijd in microseconden (via php.net). Het gebruik van deze functie is handig voor het maken van sessietokens en zelfs voor het vormen van sleutels zoals te zien in Beveilig uw formulieren met behulp van de form-keys.
"; print uniqid (" NETTUTS ", TRUE); // Een extra prefix toevoegen en more_entropy instellen op TRUE?>
De functie uniqid ()
accepteert twee parameters de eerste voegt een voorvoegsel toe aan de resultaten terwijl de tweede, indien ingesteld op WAAR, extra entropie zal toevoegen aan het einde van de geretourneerde waarde.
Er zijn een aantal voorbeelden op het web die willekeurige wachtwoorden genereren, allemaal doen ze het prima. "Maar waarom," u vraagt "zou ik een willekeurig wachtwoord moeten genereren?" Welnu, het antwoord is simpelweg dat u niet hoeft te vertrouwen op de eindgebruiker om zichzelf bij het begin een minder beveiligd wachtwoord te geven. Het genereren van willekeurige wachtwoorden is erg handig bij gebruikersregistraties of wanneer een gebruiker een verzoek indient omdat ze hun wachtwoord zijn vergeten. Als u dit doet, zorgt u voor een sterk wachtwoord aan het begin van een gebruikerservaring op uw website of kunt u coderegels verwijderen wanneer een gebruiker opnieuw toegang moet krijgen.
Laten we enkele voorbeelden bekijken: Voorbeeld 1
In dit voorbeeld wordt een tekenreeks geschud met str_shuffle
en retourneert een tekenreeks binnen een geteld bereik. Dus als je een wachtwoord van 8 tekens wilt genereren, geef je 8 door aan de functie randompassword of randompassword (8) uit je broncode.
Voorbeeld 2
Ter vergelijking: voorbeeld één neemt een statische tekenreeks en vermengt deze en retourneert deze vervolgens, bijvoorbeeld twee toevoegingen in meer dynamische smaak (mmm smakelijk). In voorbeeld twee is de reeks die wordt geschud niet langer statisch, maar verandert deze met elke generatie. Hoewel het eerste voorbeeld in de meeste gevallen zeker voldoende is om een sterk wachtwoord te genereren, kunnen we in het tweede voorbeeld controleren of de tekenreekslengte en tekens tijdens gebruik veranderen, waardoor de kans op duplicatie sterk vermindert..
Het afdwingen van het gebruik van sterke wachtwoorden in een webtoepassing zal gebruikers ervan weerhouden om een website te bezoeken of zich hiervoor aan te melden. Het is vaak een afweging tussen het verkrijgen van het verkeer dat u wenst en het waarborgen van de beveiliging van de applicatie. Ik raad u aan uw gebruikers toe te staan hun eigen wachtwoorden te maken bij de aanmelding, of hen in staat te stellen te kiezen tussen deze twee.
Het zouten van wachtwoorden is een effectieve manier om de veiligheid van uw gebruikersaccounts te vergroten, zelfs als een aanvaller toegang tot uw database verkrijgt, als u het goed hebt gedaan. Er kan worden betoogd dat een aanvaller met toegang tot het zout nog steeds je inloggegevens kan verkrijgen. Hoewel dit klopt, zal het toepassen van enkele randomisatietechnieken op de opslag van wachtwoorden dat proces buitengewoon moeilijk maken, vooral als de opslag van gebruikersinformatie en -inhoud is onderverdeeld in afzonderlijke databases.
Ook dit valt onder de "niet-afhankelijkheid van de eindgebruiker om zichzelf een eenvoudige beveiligingsmaatregel" te bieden. Gebruikers gebruiken over het algemeen wachtwoorden die gemakkelijk te onthouden zijn en gebruiken zelfs dezelfde wachtwoorden op meerdere websites (ik weet het, toch !?). Makkelijk te onthouden wachtwoorden zijn over het algemeen woorden in een woordenboek en andere soorten waarden (bijvoorbeeld 12345, QWERTY). Als ontwikkelaars spotten we vaak met deze praktijk, maar we kunnen niet ontkennen dat het gewoon is zoals de dingen zijn.
Om een webtoepassing een zout in een wachtwoord te laten gebruiken, moet de toepassing deze ergens opslaan. Het wordt niet aanbevolen om hetzelfde zout te gebruiken in een hele database van wachtwoorden, maar om een uniek zout per gebruiker te genereren. Het genereren van één zout voor een hele database verlaagt in feite de veiligheid van de webtoepassing in die zin dat als een aanvaller erin slaagt om het te kraken, het hele systeem kapot is, of als het verloren gaat, de database onbruikbaar maakt. Het creëren van een volwaardig ledenregistratiesysteem met alle toeters en bellen valt buiten het bestek van deze tutorial, maar we zullen een eenvoudig systeem creëren om een voorbeeld te gebruiken. Laten we kijken naar het genereren van een zout en enkele randomisatietechnieken toepassen:
Hier is de SQL-tabel die we zullen gebruiken.
CREATEER DE TABEL INDIEN NIET BESTAAT 'gebruikers' ('usr_id' int (11) NOT NULL AUTO_INCREMENT, 'usr_name' varchar (24) NOT NULL, 'usr_pass' varchar (32) NOT NULL, 'usr_email' varchar (255) NOT NULL, 'usr_salt' varchar (255) NOT NULL, PRIMARY KEY ('usr_id')) ENGINE = MyISAM DEFAULT CHARSET = latin1;
Succes'; else echo 'Mislukking
'; ?>
Laten we de PHP-code doornemen. Om het eenvoudig te houden, nemen we ons databaseconfiguratiebestand op. Volgende PHP controleert om te zien of het formulier HTML is ingediend door te controleren of het $ _POST
variabelen zijn niet leeg. Als ze niet leeg zijn, gaat het script verder met het ontsluiten van de geposte formuliergegevens van de gebruiker, die het voorbereiden om in de database te worden ingevoegd. Vervolgens genereren we een eenvoudig zoutgebruik uniqid ()
en MT_RAND ()
en het opslaan in de variabele $ salt_gen
. Om ons wachtwoord te zouten combineren we het $ wachtwoord en dan het zout. Volgende stap, een manier hashen de gecombineerde variabelen met md5.
"Maar wacht even! Je hebt ook het e-mailadres van de gebruiker toegevoegd aan de voorkant van het wachtwoord en de salt-combo!" JEP! Ik deed dit omdat als een aanvaller op de een of andere manier toegang heeft tot mijn database en het zout, de enige manier waarop de aanvaller zeker weet dat het e-mailadres wordt gebruikt bij het hashen van het wachtwoord, is als ze toegang hebben tot de broncode. Hoe willekeurig en uniek een e-mailadres is?
Om de rest van de PHP-code af te ronden, voegen we onze variabelen in de databasetabel in hun respectievelijke velden in en geven we de gebruiker feedback over succes of falen. Nu naar de rest van het registratiebestand, de HTML
Hier maken we een eenvoudig HTML-formulier dat een gebruikersnaam, een e-mailadres en een wachtwoord van een gebruiker verzamelt. Niets bijzonders hier.
We hebben nu dus een eenvoudig registratieformulier, dat een gebruiker in de database invoegt, samen met hun gezouten wachtwoord. Laten we een inlogpagina maken waarvoor we informatie uit de database moeten ophalen en de gebruiker moeten verifiëren. Eerst de PHP:
Yippie, we zijn geverifieerd!'; else echo 'Oh nee, we zijn niet geauthenticeerd!
'; else echo 'Oh nee, we zijn niet in de database!
'; ?>
Wat we feitelijk doen in het login.php-bestand, is de ingediende formuliervariabelen te nemen, de tabelrij te pakken die bij de gebruikersnaam hoort en het wachtwoord opnieuw samen te stellen uit de elementen in de database waarmee het is gemaakt (e-mail, pass, salt) en opnieuw te schakelen . Vervolgens controleren we de database opnieuw op de gebruikersnaam EN de gereserveerde wachtwoordwaarde om een overeenkomst te vinden die de gebruiker op succes of mislukking uitvoert. Eindelijk hier is de HTML:
Een eenvoudige maar complexe definitie van obfuscation is (gebruik de versie in de bron als u de code wilt uitvoeren):
Zoals u kunt zien, is het niet de bedoeling dat deze code te onderscheiden is. Er zijn geen verschillende variabelenamen, er zijn geen opmerkingen, geen spatiëring, geen inspringing, geen afzonderlijke volgorde en het staat allemaal op één regel. Hoewel we de code niet kunnen onderscheiden, weten onze machines toch wat het is. Het werkt. Deze ene chaoslijn echoot eenvoudigweg: "Obfusie is een techniek die wordt gebruikt om code zodanig te compliceren dat ik het niet begrijp." Ja, ik weet van de fouten.
Obfuscation heeft voor- en nadelen. Het doel is om iemand ervan te weerhouden te achterhalen welke code in één oogopslag of voor een bepaalde periode werkt. Dit is een voordeel voor individuen met weinig tot geen kennis van de programmeertaal. Iedereen met een basiskennis van PHP kan de bovenstaande versluierde code verspreiden en erachter komen wat het doet, het kan even duren. Dit is een van de gebreken van versluiering, het is geen vorm van codering, het is gewoon een poging om cryptisch te zijn. Obfuscation voegt normaal ook toe aan bestandsgrootte. Vaak kom je onoverzichtelijke code tegen in propriataire en kwaadwillende software.
Dit is een veel voorkomende vraag. Er zijn in de eerste plaats twee manieren om je code te versluieren. Ten eerste kun je het met de hand doen. Het schrijven van versluierde code duurt lang. Het voorbeeld dat in dit artikel wordt gebruikt heeft even geduurd om dezelfde reden dat je in de eerste plaats obfuscation hebt gebruikt (gebrek aan structuur, volgorde, enz.), Dit heeft zelfs geleid tot een aantal vergissingen die ik niet eens wilde proberen op te sporen en repareer. De tweede manier waarop u uw code kunt versluieren, is door software te kopen die dit voor u doet. Het gebruik van een programma om code te verdoezelen is triviaal, en kost natuurlijk veel geld. Sommige software die beweert je code te versluieren, codeert en / of codeert het op zo'n manier dat het afhankelijk is van een handdruk om te functioneren. Vaak vindt u software waarvan de leverancier niet eens garandeert dat uw code zal werken als deze klaar is. Zelfs in het voorbeeld gebruikte ik een simpele Base64
functie om de constructie van de scriptuitvoer te coderen.
Het hangt echt van je plan af. Vooral als je op zoek bent om je PHP-script (of software) te verkopen, moet je het een licentie geven. Dit wordt een van de verdedigingen van de frontlinie die het beoogde publiek van software verhindert om te doen wat ze willen. Een goed voorbeeld van licenties is te vinden in de Envato Marketplace Wiki. Het kan echter zijn dat u sommige of al uw code om welke reden dan ook wilt verduisteren. Maar vanwege verwaarloosbare negatieven, als je je echt zorgen maakt over de beveiliging van je broncode, is het misschien de moeite waard om naar encryptie te zoeken.
Wikipedia.com definieert cryptografie als:
"de praktijk en studie van het verbergen van informatie."
Cryptografie is een groot probleem, of je je er nu bewust van bent of niet. In bijna elke webapplicatie die momenteel wordt ingezet, wordt er enige aanwezigheid van cryptografie gebruikt (dat wil zeggen e-mailclients en websites). Als ontwikkelaars moeten we geïnformeerd en op de hoogte zijn van de praktische toepassingen van cryptografie in onze software. PHP biedt ons enkele zeer fundamentele en praktische functies die we kunnen gebruiken om gegevens te versleutelen. In deze sectie zal ik voornamelijk ingaan op hashing-algoritmen voor eenrichtingsverkeer, hoewel ik licht op symmetrische sleutel gebaseerde codering zal aanraken. Er zijn nog veel meer (d.w.z. Steganography, Asymmetric-Key om een paar te noemen).
Veel van de tijd gebruiken we unidirectionele hashing als een manier om veilig wachtwoorden op te slaan en de gegevensintegriteit van bestanden te controleren. Terwijl we dit doen, bevestigen gebruikers van een webtoepassing hash dat de gebruikers het wachtwoord hebben ingevoerd en vergelijken met de gebruikers opgeslagen hash. Dezelfde techniek is van toepassing op het controleren van de integriteit van bestanden.
SHA-1, 2 en 3
De SHA-familie van hash-algoritmen is momenteel het populairst, aanzienlijk SHA-1. Hoewel het SHA-1-algoritme mogelijk een zwakte heeft, wordt het nog steeds veel gebruikt.
"; echo $ hash2."
"; // Uitvoer: 42d2f15c3f92d28d7d58776e5d81b800f662cc6c?>
In PHP wordt SHA-2 in een ander opzicht opgeroepen en vereist PHP 5 groter dan of gelijk aan 5.1.2. SHA-2 is superieur aan SHA-1 en kan met verschillende bitgrootten worden aangeroepen.
"; echo $ hash_sha384."
"; echo $ hash_sha512."
? ", / * Uitgangen repspectively: sha256: 09074adc0d70e15b88494643e29c2836e1ab94a21989691dec594cb0bd742ebc SHA384: 8535470750df54a78701d4bfe0451f9799057a5bc101944a32480d2436e8b95440bce3bcab3f9ce107b0b92d9595ae32 sha512: c2e6dce873a71800b862791e56b480b976bb26cd3136c02da510c3905caa49b7b9e9260549976e1e741cc93e4569a611f2030d3b7104c6c6c2ff9e6c9bf0946a * />
De hash-functie wordt geroepen door hash (algoritme, string); In de nieuwste PHP-versies kan de hash () -functie worden gebruikt om elk one-way hash-algoritme PHP-ondersteuning aan te roepen (md5, sha-1, haval, ghost). Als u een lijst wilt zien van alle geregistreerde hash-algoritmen die u kunt gebruiken:
= 5.1.2 print_r (hash_algos ()); ?>
SHA-3 wordt nog steeds ontwikkeld en overwogen voor standaardisatie. Een wedstrijd om een goede kandidaat te vinden om op te treden als het nieuwe veilige hash-algoritme werd gelanceerd door het National Institute of Standards and Technology en inzendingen voor de competitie werden op 31 oktober 2008 beëindigd. Een vrij populaire entry genaamd Skein heeft een beschikbare PHP-module u kunt downloaden (hoewel u het zelf moet compileren). Streng is ontwikkeld door een aantal grote namen in de beveiligingsindustrie, zoals Bruce Schneier, Niels Ferguson en Stefan Lucks om er maar een paar te noemen. De officiële website van Skein is hier te vinden.
Symmetrische-sleutel versleutelingsmethoden is waar de beveiliging van de versleuteling zich voornamelijk bevindt binnen een sleutel, die wordt gedeeld tussen twee punten, waar de gegevens worden gecodeerd en waar de gegevens worden gedecodeerd. Een heel goed voorbeeld van hoe dit kan werken, werd geleverd door Christian Beikov's "Creating a Crypter Class with PHP" tutorial.
In wezen is HMAC als een mix van hashing in één richting en codering op basis van sleutels. HMAC-beveiliging is afhankelijk van de gebruikte sleutelgrootte en de sterkte van de hashfunctie waarmee wordt berekend. Je kunt deze methode enigszins vergelijken met het zouten van wachtwoorden.
";?>
Nou wat een reis! Het willekeurig houden van waarden, het genereren van willekeurige wachtwoorden, zouten, opslaan en authenticeren van gebruikers, obfuscatie, crypto ... lijkt veel op te nemen. Maar de moeite waard! Het is belangrijk om te weten welke beveiliging u in uw webtoepassingen gaat gebruiken en hoe u deze gaat beschermen. Sterker nog, het is belangrijk om een slimme houding aan te nemen ten opzichte van deze implementaties en niet te denken dat beveiliging slechts op enkele manieren wordt geïmplementeerd, maar door een combinatie van hen, met een vleugje creativiteit.