Ik ben al een tijdje bezig met een API System te maken voor mijn website. In de database komen namelijk persoonlijke gegevens te staan die extern op te vragen zijn. Dus wil ik er zeker van zijn dat dit systeem veilig en waterdicht is.

Zo ziet de code van het systeem er ongeveer uit:

API Client:

<?php
// API Content
if (isset($_POST['username']) && isset($_POST['password'])) {
	// Encrypted Post Fields
	$username = base64_encode($_POST['username']);
	$password = base64_encode(sha1($_POST['password']));
	$ip_adress = base64_encode($_SERVER['REMOTE_ADDR']);
	
	// PHP Curl
	$ch = curl_init($api_server);
	curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch, CURLOPT_POSTFIELDS, 'api_key=' . $api_key . '&website=' . $_SERVER['HTTP_HOST'] . '&username=' . $username . '&password=' . $password . '&ip_adress=' . $ip_adress);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	$re = curl_exec($ch);
	curl_close($ch);
	
	// Handle Data
	$api_content = explode('|', $re);
	if (empty($api_content[10])) {
		echo $re;
	} else {
		$data1 =   $api_content[0];
// enz enz

	}
} else {
// Hier het formulier om in te loggen  
}
?>


API Server:
De code hiervan komt niet online te staan, hieronder staat informatie die mij belangrijk lijkt om in te schatten of mijn systeem veilig is:

- Iedere query die door de database word uitgevoerd is beveiligd met de volgende functie:

<?php
// Mysql Injection
function clean_input($query) {
	$query = stripslashes($query);
	$query = strip_tags($query);
	$query = trim($query);
	return mysql_real_escape_string($query);
}
?>

- Het wachtwoord ziet er ongeveer zo uit:

<?php
$password = md5(($salt . $_POST['password']) . $salt);
?>

- De API code word gecontroleerd met de database, net zoals die website die gebruikt maakt van de API Client
- De data word uit de database 'ge-echo-ed' (onbeveiligd)
- De server maakt een logbestand met: ip adres gebruiker, ip adres website, api key, query, tijd, datum

Alvast bedankt!
Ik roep maar wat, maar waarom geen wsdl, soap, xml, json of weetikveelwat?
Daar heb ik inderdaad ook naar gekeken.
Maar het voordeel ten opzichte van deze manier daarvan werd me niet echt duidelijk.
Dus heb ik het op deze manier gedaan.
MD5 en veilig/waterdicht? Wat is het punt om geen SHA te gebruiken? En ik neem aan dat je geen SSL gebruikt? In dat geval is spreken van veiligheid/waterdichtheid natuurlijk valse hoop. En het is gewoon een API, geen API System, alhoewel dat wel stoer klinkt natuurlijk. Daarnaast wil ik nog even meegeven dat je foutmeldingen op productie uit moet zetten en dat $_SERVER['REMOTE_ADDR'] door de gebruiker aangepast kan worden. Verder netjes.
The Force op 03/02/2011 01:42:11

MD5 en veilig/waterdicht? Wat is het punt om geen SHA te gebruiken?
Wat is eigenlijk het verschil tussen MD5 en SHA? Ik heb altijd het idee dat meestal MD5 wordt gebruikt. Maar is dat niet goed dan? En als het niet goed is, waarom gebruikt dan niet iedereen SHA?

En waarom zet TS base64_encode op de POST gegevens? Waar dient dat voor?
md5 geeft je altijd het zelfde resultaat.
Met die sha krijg je elke keer een andere waarde.

Het probleem met md5: je kan die md5 waarde Googlen. Als dat een simpel paswoord is (geen camel caps, een bestaand woord, ...), is de kans vrij groot dat je een resultaat vindt.
"Het probleem met md5: je kan die md5 waarde Googlen. Als dat een simpel paswoord is (geen camel caps, een bestaand woord, ...), is de kans vrij groot dat je een resultaat vindt."

Dit is me geheel duidelijk, maar dit niet:

"md5 geeft je altijd het zelfde resultaat.
Met die sha krijg je elke keer een andere waarde."

Hoe bedoel je dat je telkens een andere waarde krijgt?
Ik neem aan dat hij bedoeld dat test de ene keer deze hash heeft en de andere keer wie die. Maar ik betwijfel dat. Maar goed,

Overigens md5 is 'gemakkelijk' te kraken, er staat zat artikelen op het internet waarin staat hoe je md5 terug kan rekenen. Er is zelf een vrouwtje uit china die het uit haar hoofd kan.
hmmmm... dus stel md5(appel) geeft 76jhkgnfm3xc en SHA(appel) geeft de ene keer sdfjksdfsf en de andere keer xfgdjkhdd??? Dat kan toch niet? Dan kun je iets toch niet vergelijken?

Terugrekenen van md5... tja... dan moet je dus salten... dat kan je toch niet "kraken"? md5(sdfsjfhsh_appel_343334) of is er nog een betere oplossing?
@Ozzie

Daarom zei ik dus dat ik het betwijfelde.

Precies, een salt gebruiken is gewoon het beste.
"Precies, een salt gebruiken is gewoon het beste."

en dan wel gewoon md5 gebruiken?

Zou dit geheel veilig zijn stel dat het een wachtwoord was?

md5(sdfsjfhsh_wachtwoord_343334)

Reageren