Goeieavond,

Ik ben nu een 2-tal weken bezig met php & mysql. Ik werk aan de hand van een boek die pas uitgekomen is en van de recentste Lynda.com videos. Ik focus me op Mysqli ipv PDO omdat ik zelf toch uitsluitend werk met Mysql. Het bevalt me enorm! Het enige dat er natuurlijk gebeurd is dat je na een tijdje begint te experimenteren. Het werkt en je bent blij...maar is het wel goed?...of correct?

Ik heb bijvoorbeeld iets simpels in elkaar geflanst, vlug vlug...

Doordat men enorm waarschuwt voor sql injection werk ik met prepared statements....

Kan iemand mij vertellen of mijn spaghetticode op "iets" trekt en veilig is? Ben ik op de goede weg?


<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>title</title>
    <link rel="stylesheet" href="style.css">
    <script src="script.js"></script>
  </head>
  <body>
  	<form action="homes.php" method="POST">
  		<p>Zoek: <input type="text" name="search" /></p>
  		<p>Voornaam: <input type="text" name="Voornaam" /></p>
  		<p>Achternaam: <input type="text" name="Achternaam" /></p>
  		<p>Adres: <input type="text" name="Adres" /></p>
  		<p>Discipline: <input type="text" name="Discipline" value="1 tot 5" /></p>
  		<p>Bevestig zoeken: <input type="submit" name="Submit" /></p>
  		<p>Voeg toe aan databank <input type="submit" name="Add_DB" value="Add to Database" /></p>
  	</form>
  <?php
	require_once 'isset.php';
	?>
  </body>
</html>



This is the PHP

<?php
	require_once 'login.php';
	$dbcon =  mysqli_connect($db_host, $db_username, $db_password, $db_database);
	if(mysqli_connect_errno()) die ("Error during connection");

	if(isset($_POST['Submit'])){
		

		$Naam = $_POST['search'];

		$Result = mysqli_query($dbcon,"SELECT * FROM customers WHERE Voornaam = '$Naam'");
		if(!$Result) die ("Nothing to show");

		$Rows = $Result->num_rows;

		for($i=0; $i < $Rows; $i++){
			$Row = mysqli_fetch_array($Result, MYSQLI_ASSOC);
			echo "Voornaam: " . $Row['Voornaam'] . "<br>";
			echo "Achternaam: " . $Row['Achternaam'] . "<br>";
			echo "Adres: " . $Row['Adres'] . "<br>";
			echo "<hr>";
			
		}
	}

		if(isset($_POST['Add_DB'])){
			$sql="INSERT INTO customers(Voornaam, Achternaam, Adres, Actief, Discipline)
				VALUES(?,?,?,NOW(),?)";

			if($stmt = $dbcon->prepare($sql)){

					$stmt->bind_param('sssi', $Voornaam, $Achternaam, $Adres, $Discipline);
					
					$Voornaam = $_POST['Voornaam'];
					$Achternaam = $_POST['Voornaam'];
					$Adres = $_POST['Adres'];
					$Discipline = $_POST['Discipline'];
					$stmt->execute();
					

					echo "New records created successfully";
}
		}

		mysqli_close($dbcon);
?>



Groeten,
Michaël
Heet het eerste PHP-bestand test.php?
Staat de foutafhandeling voor de database in login.php?
Wat is issset.php?
Het eerste bestand heet test.php

in mijn login php file staat gewoon:

$db_host = "localhost";
$db_username = " blablabla";
$db_password = " blablabla";
$db_database = "blablabla";


issset.php is mijn php code die ik gelinkt heb

<?php
	
	require_once 'login.php';
	$db_con= new mysqli($db_host, $db_username, $db_password, $db_database);
	$db_con->set_charset("utf8");
	if($db_con->connect_error) die ("(" . $db_con->connect_error . " Error during connection");

	if(isset($_POST['zoeken'])){


	$zoeknaam = $_POST['Zoek']; // declare the input here
	$stmte = $db_con->prepare("SELECT * FROM customers WHERE Voornaam = ?");
	$stmte->bind_param("s", $zoeknaam); // then use inside here
	$stmte->execute();


	$rows = $stmte->num_rows;

	if($stmte->num_rows > 0) {
    $results = $stmte->get_result();
    while($row = $results->fetch_assoc()) {
    
    echo $row['Achternaam'] . '<br/>';
        // and other columns
   
}
}
}


?>




Even een vraagje over het SQL-injection probleempje. -->

Buiten dat het moet gebeuren voor je login variabelen , om ze af te vangen met 'mysgl_real_escape_string', moet het ook voor alle andere velden in je systeem. Dus bij registratie van NAW, Bankrekeningnummer (IBAN), etc, ??
Kort antwoord: Op alle data die een gebruiker maar invoert of aan kan passen moet je controleren of de inhoud schadelijke data bevat.
Ik neem ook dat dat geldt voor je NAW-gegevens en bankrekeningsnummers.

Dus ja, ook hierbij geldt dat je het moet escapen. Verder is gebruik van de mysql_*() extentie afgeraden, en wordt PDO of MySQLi aangeraden.
Maar je kan die velden toch ook wel afvangen met javascript ?
Ja, maar Javascript werkt lokaal, en is uit te zetten/manipuleren.
Dus als je valideert:

- Validatie reeks controle (mailadres, telefoonnummer, website, etc...)
- SQL injection filteren
- Input validatie met JavaScript/HTML5
Duidelijke taal Aar ! Dank je.
Waarom zou je het risico lopen dat ergens $db_username of $db_password wordt weergeven?
Zet die gewoon NIET in variabelen, maar hardcoded in de code.
Nu doe je dat ook, maar wel via een variabele. Geen enkel voordeel, alleen maar mogelijke nadelen.

Dus doe het zo:

<?php

// require_once 'login.php';
    $db_con= new mysqli("localhost", "gebruikerX", "kdeN3nen_83", "database");
    $db_con->set_charset("utf8");

?>

Waarom zou je die variabelen ook echo'en? Je kan ze ook direct weer unset()-en nadat je ze gebruik hebt in de connectie. Dan kan niemand ze echo'en via een exploit ofzo.

Verder was die reactie waarop je reageert van iemand anders, en inmiddels gedateerd. Dit even ter informatie.
Eddy E op 05/05/2015 17:22:08
Waarom zou je het risico lopen dat ergens $db_username of $db_password wordt weergeven?
Zet die gewoon NIET in variabelen, maar hardcoded in de code.

Als je je daar druk om moet maken, heb je problemen van een hele andere orde. Daarmee geef je in feite toe dat je niet in kunt staan voor de veiligheid van je eigen code.

Het is heel goed denkbaar dat je dit soort parameters wilt vangen in variabelen, bijvoorbeeld in een configuratie-bestand dat verschillende waarden heeft voor een vaste set parameters op grond van bijvoorbeeld een hostname.
<?php
switch ($_SERVER['HTTP_HOST']) {
    // development
    case 'mysite.dev':
        $config->database = array(
            'user'     => '...',
            'pass'     => '...',
            'database' => '...',
            // etc...
        );
        // more host specific config...
        break;
    // production
    case 'mysite.com':
        $config->database = array(
            'user'     => '...',
            'pass'     => '...',
            'database' => '...',
            // etc...
        );
        // more host specific config...
        break;
    default:
        die('unknown hostname');
}
?>

Zoals gezegd, als iemand het op een of andere manier voor elkaar krijgt om de inhoud van $config af te drukken, dan wil dat zeggen dat iemand op een of andere manier PHP-code kan uitvoeren. Dan ben je al nat.

Dit klinkt als een soort mantra wat je je ooit hebt aangeleerd, maar waarvan je niet meer precies weet waarom het ook alweer zo zou zijn.

Ontopic: ik vind het grappig dat er zoveel nadruk wordt gelegd op het escapen van van alles en nog wat op het gebied van MySQL, en vervolgens druk je data die uit je database komt gewoon af, zonder deze te escapen :D. Dan mis je toch een beetje het punt geloof ik.

Vertrouw nooit user input. Ook / vooral niet nadat je deze hebt opgeslagen in je database lol.

Reageren