ik zie dat ik een behoorlijk veiligheidslek heb op mijn website.
Het gaat om de volgende site: www.jackmaessen.nl
Je kunt inloggen met username:test en password: pass
Eenmaal ingelogd, klik in de navigatie op "My account"
Kijk vervolgens in de url en zie dat de username in de url wordt aangeroepen
(http://www.jackmaessen.nl/userinfo.php?user=test)
er is dus nu vrij gemakkelijk de info van andere leden te raadplegen door bv. in de url "test" te vervangen door "piet" of een andere naam. Dit mag natuurlijk nooit gebeuren.
Het script dat de info parsed ziet er als volgt uit:


                                <!-- MY ACCOUNT INFO -->


<?php
/**
 * UserInfo.php
 *
 * This page is for users to view their account information
 * with a link added for them to edit the information.
 *
 * Updated by: The Angry Frog
 * Last Updated: October 26, 2011
 */

if (!isset($_GET['user'])) { 
	header("Location: ".$config['WEB_ROOT'].$config['home_page']);
}
?>



<?php
/* Requested Username error checking */
$req_user = trim($_GET['user']);
if(!$req_user || strlen($req_user) == 0 ||
   !preg_match("/^[a-z0-9]([0-9a-z_-\s])+$/i", $req_user) ||
   !$database->usernameTaken($req_user)){
   die("Username not registered");
}

/* Logged in user viewing own account */
if(strcmp($session->username,$req_user) == 0){
   echo "<h6><br>My Account</h6>";
}
/* Visitor not viewing own account */
else{
   echo "<h6>User Info</h6>";
}

/* Display requested user information - add/delete as applicable */
$req_user_info = $database->getUserInfo($req_user);

/* Username */
echo "<b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Username: ".$req_user_info['username']."</b><br />";

/* Email */
echo "<b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Email:</b> ".$req_user_info['email']."<br />";

/**
 * Note: when you add your own fields to the users table
 * to hold more information, like homepage, location, etc.
 * they can be easily accessed by the user info array.
 
  * $session->user_info['location']; (for logged in users)

  * $req_user_info['location']; (for any user)
	*/
	
 
 
 
 

/* If logged in user viewing own account, give link to edit */
if(strcmp($session->username,$req_user) == 0){
   echo '';
}

/* Link back to main */
/*echo "<br>Back To [<a href='".$config['WEB_ROOT'].$config['home_page']."'>Main</a>]<br>";*/

?>
																										 <!-- EINDE MY ACCOUNT INFO -->


Hoe kan ik dit beveiligen?
nu zie ik dat de html na de "die" echo niet meer geladen wordt. Het gaat om de footer van de pagina.
Ik heb de html code van de footer in bestand footer.php opgeslagen en geinclude na de "die" echo, maar hij laadt hem niet.

<?php

/* Requested Username error checking */
$req_user = trim($_GET['user']);

if(!$req_user || strlen($req_user) == 0 ||
   !preg_match("/^[a-z0-9]([0-9a-z_-\s])+$/i", $req_user) ||
   !$database->usernameTaken($req_user)){
	 
   die("<br /></br />Username not registered or you don't have permission to view this information");
	
}
include("footer.php");


/* Logged in user viewing own account */
if(strcmp($session->username,$req_user) == 0){
   echo "<h6><br>My Account</h6>";
}


/* Visitor not viewing own account */
else{
header('Location: userinfo.php');
   /*echo "<h6><br /><br />User Info</h6>";*/
}
>?

wat gaat er fout?
hoe kan ik dit dan oplossen? er moet namelijk nog een footer onder komen...
Jack maessen op 25/12/2012 17:03:23

ik snap niet waarom de browser dat stuk html wat er achter komt niet gewoont toont?


Volgens mij geeft Not Moose het antwoord:
Not Moose op 25/12/2012 16:29:31

Na die() of exit() stopt je script. http://nl3.php.net/manual/en/function.die.php


ja dat heb ik bekeken en idd het pad loopt dan dood....
is er dan geen enkele manier om die footer erna nog te tonen?
Ja, geen die() gebruiken. Dat is gewoon geen foutafhandeling.
oke, daar heb je ook wel gelijk in Erwin.
Ik heb ze nu naar een aparte pagina gestuurd "forbidden.html" met een link erin waar ze terug gaan naar de index.php, die de inlogsessie weer controleert waardoor ze of hun eigen bestanden weer zien of de inlogform voor hun neus krijgen

<?php
if(strcmp($session->username,$req_user) == 0){
echo "<h6><br>My Account</h6>";
}


/* Visitor not viewing own account */
else{
header('Location: forbidden.html');
/*echo "<h6><br /><br />User Info</h6>";*/
}
?>


Leer je aan om nooit die() of exit() te gebruiken, zeker niet als foutafhandeling. Je kan er erg rare dingen door krijgen.

En dan ga ik nu iets geks zeggen.... in het laatste script dat je post zou je het juist wel moeten gebruiken. Na een redirect wil je namelijk dat wat er nog na komt hoe dan ook niet meer wordt uitgevoerd. Na een redirect is het dus juist wel een goede gewoonte om een exit() te plaatsen. Daarmee voorkom je dat er onverwachts toch nog een actie uitgevoerd wordt.
Wat is eigenlijk het verschil tussen DIE en EXIT?

Reageren