Bekijk Volledige Versie : php / mysql / code veiligheid exploit testen?
Ik sta op het punt om een nieuw project online te zetten, maar wil het eerst goed (laten) testen voor eventuele exploit(s).
Hoe doen jullie dit normaal? Huren jullie iemand in?
Ramon Fincken
08/09/10, 13:15
zo ! dus het is al klaar en je denk nu pas over de veiligheid? Is daar niets over afgesproken vantevoren? Heb je al inzage in de code gehad?
zo ! dus het is al klaar en je denk nu pas over de veiligheid? Is daar niets over afgesproken vantevoren? Heb je al inzage in de code gehad?
Het is iets wat ik zelf gemaakt heb, waarbij veiligheid op de 1st plaats stond.
Ik wil het nu gewoon nog een keer goed testen.
Ramon Fincken
08/09/10, 14:03
ah op die manier! Je zou daar inderdaad iemand voor kunnen inhuren, dat gaat meestal op uurtarief of fixed price voor een aantal bekende exploits.
Ik neem aan dat je alle userinput al niet vertrouwd en dus ook niet zomaar iets queried zonder het veilig maken van de query?
ah op die manier! Je zou daar inderdaad iemand voor kunnen inhuren, dat gaat meestal op uurtarief of fixed price voor een aantal bekende exploits.?Weet jij iemand die dit tegen betaling doet?
Ik neem aan dat je alle userinput al niet vertrouwd en dus ook niet zomaar iets queried zonder het veilig maken van de query?
Dat was het 1ste waar ik aan dacht :-)
Mocht je vaker zelf met PHP aan de gang gaan, zou ik me dat toch eigen maken als ik jou was. Op internet is veel te vinden over de meest voorkomende valkuilen.
Query veilig maken voor SQL injectie kan je gebruik maken van db_escape. Die zorgt ervoor dat in de query de nummers geen quotes krijgen, de strings wel (en escaped deze), lege variabelen worden NULL zonder quotes.
function db_escape($values, $quotes = true) {
if (is_array($values)) {
foreach ($values as $key => $value) {
$values[$key] = db_escape($value, $quotes);
}
}
else if ($values === null OR empty($values)) {
$values = 'NULL';
}
else if (is_bool($values)) {
$values = $values ? 1 : 0;
}
else if (!is_numeric($values)) {
$values = mysql_real_escape_string($values);
if ($quotes AND $values != "NULL") {
$values = "'" . $values . "'";
}
}
return $values;
}
Edit: geeft je geen garantie! controleer/beperk altijd je variabelen!
Hallo Acceler,
Bedankt voor de inpit. Ik maak al gebruik van zo een soort functie, en voorzover ik het kan zien is alles goed dicht getimmert.
Zal deze week maar weer eens al de code doorlopen en nog eens kijken of ik een potentieel probleem kan vinden.
Vergeet de "hufter-test" niet! Succes en laat het weten als je handige tegenmaatregelen hebt :)
Triloxigen
08/09/10, 17:23
Ligt er ook an of je iemand zoekt die de problemen blootlegt, of dat die ze ook oplost.
Ligt er ook an of je iemand zoekt die de problemen blootlegt, of dat die ze ook oplost.
Vraag een free scan aan op www.secpoint.com
Mocht je vaker zelf met PHP aan de gang gaan, zou ik me dat toch eigen maken als ik jou was. Op internet is veel te vinden over de meest voorkomende valkuilen.
Query veilig maken voor SQL injectie kan je gebruik maken van db_escape. Die zorgt ervoor dat in de query de nummers geen quotes krijgen, de strings wel (en escaped deze), lege variabelen worden NULL zonder quotes.
function db_escape($values, $quotes = true) {
if (is_array($values)) {
foreach ($values as $key => $value) {
$values[$key] = db_escape($value, $quotes);
}
}
else if ($values === null OR empty($values)) {
$values = 'NULL';
}
else if (is_bool($values)) {
$values = $values ? 1 : 0;
}
else if (!is_numeric($values)) {
$values = mysql_real_escape_string($values);
if ($quotes AND $values != "NULL") {
$values = "'" . $values . "'";
}
}
return $values;
}
Edit: geeft je geen garantie! controleer/beperk altijd je variabelen!
Tip: gebruik geen nummeric voor getallen, gebruik daarvoor ctype_digit((string) $values) in nummeric mag ook -> 1e4
Tip: gebruik geen nummeric voor getallen, gebruik daarvoor ctype_digit((string) $values) in nummeric mag ook -> 1e4
De vraag is of dat erg is. Je kunt in bijvoorbeeld een select query namelijk ook 1e4 als integer gebruiken. Of je moet natuurlijk voor een ander doeleinde weten of de var een getal is.
De vraag is of dat erg is. Je kunt in bijvoorbeeld een select query namelijk ook 1e4 als integer gebruiken. Of je moet natuurlijk voor een ander doeleinde weten of de var een getal is.
Getallen ook gewoon tussen quotes staan daar geeft mysql niks om
SELECT * FROM table WHERE ID > "10"
Je zou dus ook alles kunnen quoten (en escapen)
Vergeet ook niet errors uit te zetten word ook nog wel eens vergeten, dan zie je gelijk de locaties van bestanden en de hele sql, hoe meer je weet van een script hoe makkelijker het te hacken is
Kijk eens naar unittesten mbv phpunit.
Naast giromaat zie ik geen een nuttige reactie en die van chielsen slaat helemaal de plank mis.
Misschien heb je hier wat aan -> http://www.owasp.org/index.php/Category:OWASP_SQLiX_Project of -> http://sqlmap.sourceforge.net/
Bedankt voor de linkjes daanl.
Ik ga er zo naar kijken, en eventueel testen op de site.
Hoezo sla ik de plank mis? Met unittesten haal je 95% van de gaten en bugs weg.