Ik heb een pagina aangemaakt dat gebruikers gegevens kunnen bewerken maar er viel mij iets op dat je vanaf urlbalk andere regels (en ook ids wat nog niet bestaat) van tabellen kunt bewerken terwijl dat de bedoeling niet is of je voert zomaar bijvoorbeeld letters er achter id= dan zie je nog steeds geen foutmelding.

Hoe zorg ik er voor dat je geen id uit je hoofd kan invoeren en overbodige letters met andere leestekens blokkeren?

Dit helpt bij mij niet:
bindParam(1,is_numeric($_GET['id']))

en dit:
is_numeric(bindParam(1,$_GET['id']))


Beetje opgeschoond om het kleiner te krijgen:
<?PHP
session_start();
if (!(isset($_SESSION['user_login_status']) && $_SESSION['user_login_status'] != '')) {
header ("Location: index.php");
	}
		else 	{
		try {
$dbc = new PDO('mysql:host=localhost; dbname=', '', '');
	} catch (PDOException $e) {
	echo "Error: " . $e->getMessage();
	}
if(isset($_POST['submit_btn'])) {
	$query = "UPDATE tabel SET name=? WHERE id=?";
	$stmt = $dbc->prepare($query);
	$stmt->bindParam(1, $_POST['name']);
	$stmt->bindParam(2, $_POST['uid']);
	if($stmt->execute()) {
		echo "<script>alert('Record updated.');location.href='index.php'</script>";
	} else {
		die('Unable to update record.');
	}
} else {
try {
$query = "SELECT * FROM tabel WHERE id=?";
$stmt = $dbc->prepare($query);
$stmt->bindParam(1,$_GET['id']);
$stmt->execute();
$row=$stmt->fetch(PDO::FETCH_ASSOC);
$username = $row['user_name'];
$id = $row['id'];
	} catch(PDOException $e) {
	echo "Error: " . $e->getMessage();
	}
?>

<form id=".$row["id"]." action="" method="POST">
<input type="hidden" value="<?php echo $id; ?>" name="uid">
  <div class="container">

<div class="panel-heading">
<h3 class="panel-title">Gegevens</h3>
</div>
  <div class="panel-body">
    	<div class="row">
			<div class="col-md-6">
					<table class="table">		
					<tbody>

				<tr>
					<td>Naam</td>
					<td><input class="form-control" type="text" id="formGroupInputSmall" placeholder="Naam"name="username" value="<?php echo $username; ?>"/></td>
				</tr>
					</tbody>
					</table>
					<input class="btn btn-default"  type="submit" name="submit_btn" value="Bevestigen"/>
</form>
			</div>
		</div>
	</div>
  </div>
</body>
<?php
}?>
</html>
<?php
}
?>
Frank Nietbelangrijk op 17/05/2015 22:09:18

Johan: Don't do it! Clear your mind!

Een gebruiker toetst in wat hij wil intoetsen als url. Ook met md5, unique_id or whatever string er in.
Stop je energie in "WAT LAAT IK ZIEN AAN WELKE GEBRUIKER".

(Hoeveel moeite kost het om iemand van een slecht idee af te helpen - lieve hemel :O )



Wees niet te snel boos ik doe wat er gezegd wordt. unique_id was alleen een extra laag om id nummer te veranderen maar dat wil je er van af komen dat begrijp ik nu.

Wat we samen hebben gemaakt heb ik voor profiel pagina toegepast dus iedereen kan alleen zijn eigen gegevens aanpassen van naam tot email adres.

Dan zit ik nog bij "Stop je energie in "WAT LAAT IK ZIEN AAN WELKE GEBRUIKER"." Het werkt goed alleen ik moet nog er voor zorgen dat user_id alleen database regels van used_id kan bewerken.
Ik ben niet boos Johan :-) Het is meer zoiets dat ik niet begrijp waarom je je (nog steeds) druk maakt om een url die kunt wijzigen.

ff domme vergelijking:

bij ieder huis kun je proberen of er een deur los is. Nu wil jij dat mensen die door de straat lopen de deuren niet meer kunnen zien. Camoufleren met baksteenmotief dan maar of zo ? ;-)
Gelukkig maar. Waar ik druk om maak is dit.

Stel jij logt in en upload je werkstuk dan is ID van je werkstuk 3.
Ik log in en upload voor de gein om te kijken waar de url op eindigd, dan zie ik achter ID 4 staan. Ik verander 4 naar 3 dan kan ik je geuploade bestand verwijderen.

Wat we net hadden was handig ik kon alleen met mij eigen ID bekijken, dat wil ik veranderen naar row van geuploaden bestanden en dat laten controleren door geuploaden gebruikers. Iedereen mag alleen zijn eigen geuploaden bestanden bewerken.
En in dat geval moet je een controle inbouwen, waarin je eerst controleert of iemand de eigenaar is:

<?php
if(isset($_GET['ID'])) {
if($_GET['ID'] == $_SESSION['UserID']) {
verwijder_bestand();
} else {
echo "Foei, stout, niet lief! Jij mag niet andermans spulletjes verwijderen.";
}
} else {
echo "Zonder ID kan ik niks!";
}
?>
je moet aan de row van werkstuk ook een foreign key toevoegen die naar de userid van de eigenaar van het geuploade bestand wijst

hoe zit zo een row van geuploade bestanden er nu uit? ik bedoel welke kolommen heb je?
Voorbeeld van jou genomen:


[mysql-server]
     |
     |- [database]
             |
             |---- [tabel] gebruikers
             |        |
             |        |---- [kolom] customer_id
             |        |---- [kolom] name
             |        |---- [kolom] email
             |
             |---- [tabel] werkstukken
                      |
                      |---- [kolom] werkstuk_id
                      |---- [kolom] customer_id
                      |---- [kolom] titel


Kortom er is een kolom voor geuploade eigenaren aanwezig.

[size=xsmall]Toevoeging op 18/05/2015 00:29:00:[/size]

<?PHP

session_start();
if (!(isset($_SESSION['user_login_status']) && $_SESSION['user_login_status'] != '')) {
    header ("Location: index.php");
    exit; // NA HEADER EEN EXIT EN JE SCRIPT STOPT DAN OOK DAADWERKELIJK
}

// INITIALISATIE ID MET DEFAULTWAARDE 0
$id = 0;
if(isset($_GET['id'])) {
    $id = intval($_GET['id']);
}

// VALIDATIE VAN $id
if($id < 1) {
    echo 'Ongeldige GET parameter id';
    exit;
}

// ALLEEN ROW VAN SESSIES IS TOEGESTAAN
if(isset($id)) {
    if($id == $_SESSION['user_id']) {
        verwijder_bestand(); // <--- WAT MOET HIER KOMEN?
    } else {
        echo "Foei, stout, niet lief! Jij mag niet andermans spulletjes verwijderen.";
    }
} else {
    echo "Zonder ID kan ik niks!";
}

try {
    $dbc = new PDO('mysql:host=localhost; dbname=', '', '');
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

if(isset($_POST['submit_btn'])) { // HIER ZOU JE EERST NOG JE FORMULIER MOETEN VALIDEREN
    $query = "UPDATE tabel SET name=? WHERE id=?";
    $stmt = $dbc->prepare($query);
    $stmt->bindParam(1, $_POST['name']);
    $stmt->bindParam(2, $_POST['uid']);
    if($stmt->execute()) {
        echo "Geupdated";
    } else {
        echo "Probeer nogmaals";
    }
    
    // EEN GOEDE GEWOONTE IS OM NA HET VERWERKEN VAN EEN 'POST' TE REDIRECTEN
    header ("Location: lijst.php"); // KIES ZELF MAAR NAAR WELKE PAGINA JE WILT
    exit;
    
}
try {
    $query = "SELECT * FROM tabel WHERE id=?";
    $stmt = $dbc->prepare($query);
    $stmt->bindParam(1, $id);
    $stmt->execute();
    $row=$stmt->fetch(PDO::FETCH_ASSOC);
    $username = $row['user_name'];
    $id = $row['id'];
} catch(PDOException $e) {
    echo "Error: " . $e->getMessage();
}
?>

<form id="<?php echo $row["id"]; ?>" action="" method="POST">
<input type="hidden" value="<?php echo $id; ?>" name="mid">
          <div class="container">

<div class="panel-heading">
<h3 class="panel-title">Gegevens</h3>
</div>
  <div class="panel-body">
        <div class="row">
            <div class="col-md-6">
                    <table class="table">        
                    <tbody>

                <tr>
                    <td>Naam</td>
                    <td><input class="form-control" type="text" id="formGroupInputSmall" placeholder="Naam"name="username" value="<?php echo $username; ?>"/></td>
                </tr>
                    </tbody>
                    </table>
                    <input class="btn btn-default"  type="submit" name="submit_btn" value="Bevestigen"/>
</form>
            </div>
        </div>
    </div>
  </div>
</body>
</html>  
Ik vraag me af of je wel goed naar mijn code gekeken hebt?
Je zult in mijn code jouw taken moeten moeten verwerken, niet daaronder.

Of het nu om verwijderen of wijzigen gaat, het komt in mijn code op hetzelfde neer.
En die functie die er in staat, die moet je zelf aanmaken of toevoegen.
Ik moet dan stukje van vorige code eruit halen en van jou inbouwen.
Ja, en kijk logisch wat mijn code precies doet, en bouw hierop uit.

Reageren