Okay ik ben met een soort beveiliging bezig, ik weet er zijn misschien betere manieren, maar dit is voor mensen die niet veel verstand hebben van php.
Ik wil een soort beveiliging inbouwen, maar de output blijft het zelfde

ik wil dit inbouwen

<?php

$ID = $_GET['ID'];
if($_SESSION['Level'] == '9') {
echo "je hebt volledige toegang";
} else {
if($_SESSION['ID'] == $ID) {
echo " Je hebt beperkte toegang";
} else {
echo "Je mag niks";
}
echo "Totaal geen toegan";
}
?>
Maar ik krijg elke keer de laatste output.
Terwijl $_SESSION['Level'] en $_SESSION['ID'] wel gezet zijn
Wat doe ik fout?

[size=xsmall]Toevoeging op 06/06/2022 12:50:35:[/size]

PS: het gaat erom dat als een gebruiker ingelogt is en die heeft een sessie level lager dan 9 moet hij alleen dat mogen doen van zijn eigen id.
dat is de bedoeling, want in de adres bar van je brouwser komt de hele link te staan met de id, dus als je de id veranderd, moet hij aangeven dat je daar geen toegang toe hebt.
Dan is de sessie niet aangemaakt.
Check eens of de sessie bestaat:

<?php
echo "<pre>".print_r($_SESSION,true)."</pre>";
?>
Log ik in als Admin, dan kan ik alles gewoon doen, log ik in als een user, dan kan ik niks
Check je sessie-array dus eens ^
Dit kan je eenvoudig uitzoeken door simpel debugwerk.
De sessie bestaat, ik zeg net dat de sessie aangemaakt wordt in de header.
Als admin kan ik wel gewoon alles doen op de page, maar als user niks
Dan zal $info['Name'] niet bestaan of overeenkomen.
deze werkt

<?php
if($_SESSION['Level'] == '9') {
echo "<td colspan='4' align='right'><a href='index.php?menu=editprofile&ID=".$info['ID']."'>Edit</a></td>";
} else {

if($_SESSION['Name'] == $info['Name']) {
echo "<td colspan='4' align='right'>You can <a href='index.php?menu=editprofile&ID=".$info['ID']."'>Edit</a> your profile</td>";
} else {
echo "<td colspan='4' align='right'>You cannot edit this profile</td>";
}
}
?>

deze niet
<?php

$ID = $_GET['ID'];
if($_SESSION['Level'] == '9') {
echo "je hebt volledige toegang";
} else {
if($_SESSION['ID'] == $ID) {
echo " Je hebt beperkte toegang";
} else {
echo "Je mag niks";
}
echo "Totaal geen toegan";
}
?>
en om deze gaat het
Het verschil tussen beide in de praktijk is dat de bovenste de naam op lijn 6 uit een array haalt (vermoedelijk een database).

En in het tweede komt dit uit $ID, wat eerder uit een $_GET blijkt te komen.

Verder klopt de statement van je laatste code niet. "Totaal geen toegang" is geen opzichzelfstaande statement. Die wordt ALTIJD uitgevoerd bij je else. Dus als Level geen 9 is, dan krijg je te zien: 'Totaal geen toegan(g)'
Het gaat niet om de statment niet om $_GET, de zelfde manier van beveiliging werkt in de ene page wel en in de andere niet.
Het gaat er niet om of de session_start() wel of niet geladen wordt, die wordt in de header geladen.
Alles staat in de sessie.
Echter werkt de zelfde opbouw in de ene pagina wel, alleen in de andere niet.
log ik in als user, dan mag ik totaal niks aanpassen, ook niet waar ik toegang zou moeten hebben, log ik als admin in, kan overal bij
Ik zie praktisch gezien wel een verschil in beide scripts, die ik net heb uitgelegd.

Maar toch vraag ik mij af: Waarom gebruik je $_GET in een inlogsysteem? Dat is hetzelfde als de sleutel buiten in het slot steken als je weggaat?
Het is geen inlog systeem waar de code instaat.
Hier de broncode in totaal waar het wel werkt.

info.php
<?php
$sql = 'SELECT * FROM Info ORDER BY ID DESC';
$result = mysqli_query($connect, $sql);
$details = mysqli_fetch_all($result, MYSQLI_ASSOC);
mysqli_free_result($result);
mysqli_close($connect);
echo"
<tr>
<td colspan='7'>";

foreach($details as $info) {

echo" <center>
<table width='800' cellspacing='2px'>
<tr><td>Photo</td>
<td colspan='2'>Info</td>
<td>Personal Info</td></tr>
<tr rowspan='4'>
<td width=100><img src='./img/profile/".$info['Name']."'.jpg width='160'></td>
<td align='left' style='vertical-align:top' width='100px'>Name :<br>Function :<br>Phone :<br>E-mail :<br></td>

<td align='left' style='vertical-align:top' width='200px'>".$info['Name']."<br>".$info['Function']."<br>+31".$info['Phone']."<br>".$info['Email']."<br></td>

<td td align='left' style='vertical-align:top' colspan='5' width='300px'>".nl2br($info['PersonalInfo'],false)."</td>
</tr>
<tr>";
if($_SESSION['Level'] == '9') {
echo "<td colspan='4' align='right'><a href='index.php?menu=editprofile&ID=".$info['ID']."'>Edit</a></td>";
} else {

if($_SESSION['Name'] == $info['Name']) {
echo "<td colspan='4' align='right'>You can <a href='index.php?menu=editprofile&ID=".$info['ID']."'>Edit</a> your profile</td>";
} else {
echo "<td colspan='4' align='right'>You cannot edit this profile</td>";
}
}
echo "
</tr>
</table>
</center>
<p>";
}
echo"
</td>
</tr>

";
?>
En hier de code waar het niet werkt, maar wel de zelfde opbouw
editprofile.php
<?php

$ID = $_GET['ID'];
if($_SESSION['Level'] == '9') {

$sql = 'SELECT * FROM Info WHERE ID="'.$ID.'"';
$result = mysqli_query($connect, $sql);
$info = mysqli_fetch_all($result, MYSQLI_ASSOC);
mysqli_free_result($result);
mysqli_close($connect);
foreach($info as $details) {
$name = $details['Name'];
$function = $details['Function'];
$phone = $details['Phone'];
$email = $details['Email'];
$info = $details['PersonalInfo'];
$id = $details['ID'];
}
echo "<center>
<form action='./inc/replaceinfo.php' method='post'>
<input type='text' name='name' value='".$name."' placeholder='".$name."'><br>
<input type='text' name='function' value='".$function."' placeholder='".$function."'><br>
<input type='text' name='phone' value='".$phone."' placeholder='".$phone."'><br>
<input type='text' name='email' value='".$email."' placeholder='".$email."'><br>
<textarea name='info' rows='25' cols='90'>".$info."</textarea><br>
<input type='hidden' name='ID' value='".$id."' size='92' placeholder='".$id."'><br>
<button type='submit' name='submit'>Edit profile</button><br>
</form>
</center>";

} else {

if($_SESSION['ID'] == $ID) {

$sql = 'SELECT * FROM Info WHERE ID="'.$ID.'"';
$result = mysqli_query($connect, $sql);
$info = mysqli_fetch_all($result, MYSQLI_ASSOC);
mysqli_free_result($result);
mysqli_close($connect);
foreach($info as $details) {
$name = $details['Name'];
$function = $details['Function'];
$phone = $details['Phone'];
$email = $details['Email'];
$info = $details['PersonalInfo'];
$id = $details['ID'];
}
echo "<center>
<form action='./inc/replaceinfo.php' method='post'>
<input type='text' name='name' value='".$name."' placeholder='".$name."'><br>
<input type='text' name='function' value='".$function."' placeholder='".$function."'><br>
<input type='text' name='phone' value='".$phone."' placeholder='".$phone."'><br>
<input type='text' name='email' value='".$email."' placeholder='".$email."'><br>
<textarea name='info' rows='25' cols='90'>".$info."</textarea><br>
<input type='hidden' name='ID' value='".$id."' size='92' placeholder='".$id."'><br>
<button type='submit' name='submit'>Edit profile</button><br>
</form>
</center>";
} else {
echo "<center><table><tr><td colspan='7' align='center'><h3>Not allowed</h3></td></tr></table></center>";
}
}
?>
En nu niet zeuren over de $_GET of session_start(), die wordt in de header geladen.
Deze pages worden door een include aangeroepen.
Zelfde opbouw alleen ander variablen, maar de info.php werkt en bij editprofile.php niet.
En mijn vraag is, waarom?
Laat ik $_SESSION['Level'] in editprofile weg, dan werkt het, doe ik die erbij, dan werkt het niet.
Als admin werkt het wel, want ik heb level 9, maar als user niet ik heb dan level 7 maar wel de id waar ik toegang toe moet hebben, maar ook dan mag ik niks.

Reageren