Ik loop mijn beveiligingen na.
Mijn specifieke wensen mbt validate worden netjes uitgevoerd.
Maar ik mis wat specifieke zaken bij de $_POST en $_GET.
Ik gebruik UTF-8 characterset.
Daar heeft de IPTC geen problemen mee.

De SANITIZE gaat standaard toch uit van andere characterset toch?
Ook dat geeft nog geen problemen.
Maar ik kan nauwelijks enige verfijning met FLAGS aanbrengen.
Ook het invoeren van specifiek verboden characters lukt niet.
Zo zijn latlon coordinaten. Met punten, en gescheiden door een komma.

Daarnaast gebruik ik op de meeste pagina's waarbij men ingelogd moet zijn:

action="<?php echo $_SERVER['PHP_SELF']; ?>"

in verleden zette je daar dan voor:

action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>"

Is dat nog veranderd?

Ik heb ook nog bij wachtwoord vergeten staan:

value="<? echo $_GET['code']; ?>"

Moet dat nog beveiligd worden?

Lees op forums daar verschillende meningen over.

Wanneer ik toch gedeeltes in database onderbreng,
geeft dit dan nog problemen met de characterset?


function Register($post, $process) {
$wijzig = '0';

		if(isset($process)) {

		$pass		= filter_var($_POST['pass1'], FILTER_SANITIZE_STRING);
		$pass2		= filter_var($_POST['pass2'], FILTER_SANITIZE_STRING);
		$user_name	= filter_var($_POST['username'], FILTER_SANITIZE_STRING);
		$email		= filter_var($_POST['email_address'], FILTER_SANITIZE_EMAIL);
		$birth		= filter_var($_POST['birth'], FILTER_SANITIZE_NUMBER_INT);
		$name		= filter_var($_POST['first_name'], FILTER_SANITIZE_STRING);
		$website	= filter_var($_POST['website'], FILTER_SANITIZE_URL); // optie
		$facebook	= filter_var($_POST['facebook'], FILTER_SANITIZE_URL); // optie	
		$youtube	= filter_var($_POST['youtube'], FILTER_SANITIZE_URL); // optie
		$address	= filter_var($_POST['zip_postal'], FILTER_SANITIZE_STRING); // optie adres
		$latlon		= filter_var($_POST['latlon'], FILTER_SANITIZE_STRING); // optie coordinaten
		$country_code	= filter_var($_POST['country'], FILTER_SANITIZE_STRING); // optie landcode
		$post_all	= filter_var($_POST['postall'], FILTER_SANITIZE_STRING); // optie postcode
		$wijzig		= filter_var ($_POST['wijzig'], FILTER_SANITIZE_NUMBER_INT); // kan alleen 1 zijn

}
}
Frank Nietbelangrijk op 30/11/2017 21:12:18

Het heeft niet zo zeer met get of set te maken. Stel je hebt een class User en een class Message. Als je een nieuw bericht aanmaakt dan wil je waarschijnlijk in het bericht de username laten zien. je zou dan zo iets krijgen:

<?php
$message->setUser($user);
?>

Dit is allemaal binnen je (o zo veilige) eigen applicatie. Er is geen reden om te valideren en al helemaal niet om te sanitizen.


Dan heb je ook geen LogicException meer nodig, zoals in dit voorbeeld een InvalidArgumentException als $user geen geldige gebruiker is? ;-)
Ward, Natuurlijk is er meer tussen hemel en aarde. Exceptions gebruiken we wel degelijk maar dat is weer wat anders als validatie.
Kan iemand me vertellen wat verschil is?
Gaat om checkboxen.
De eerste toont alles 'checked'.
De tweede toont alles 'unchecked'.
Probleem is opgelost door een !isset te doen.
Maar ben verrast dat de check van de checkbox ander wordt.


<?php $field1 = htmlspecialchars($_POST['WerkA']); if (isset($field1)){ echo "checked='checked'";} ?>

<?php if (isset($_POST['WerkA'])){ echo "checked='checked'";} ?>
Voor dit soort gevallen ga je 2 dingen niet doen:
1. De variabele kopieren naar een andere variabele
2. htmlspecialchars() gebruiken.

Gebruik gewoon if (isset($_POST['WerkA'])), anders zijn de resultaten mogelijk niet wat je verwacht. Het verrassende is hier dat je nog steeds escaping toepast op input, iets dat al vaak genoeg gezegd is niet te doen.
Bedank Ben...
Werd hiervoor door Frank als reactie geschreven:
Verkeerd begrepen ?

<?php
$title = '</h1></body>';
?>
<body>
    <h1><?php echo htmlspecialchars($title); ?></h1>
    <p>Some content</p>
</body>

Regel 1:

In het eerste deel maak je een nieuwe variabele aan en kent er een waarde aan.
In het tweede deel test je of $field1 bestaat wat dus altijd het geval is.


Regel 2:
Hier doe je het goed. Jammer dat je geen HTML laat zien.

Dit is hoe het zit:

Een checkbox gebruik je met een boolean. Deze is true of false.


<?php
$agree = false;

if($_SERVER['REQUEST_METHOD'] == 'POST') {
	if(isset($_POST['agree'])) {
		$agree = true;
	}
}
?>
<form method="post">
	<label>
		<input type="checkbox" name="agree" <?php if($agree) echo ' checked="checked"'; ?>> Gaat u akkoord?
	</label>
</form>



[size=xsmall]Toevoeging op 01/12/2017 17:09:41:[/size]

Hans De Ridder op 01/12/2017 17:01:47

Bedank Ben...
Werd hiervoor door Frank als reactie geschreven:
Verkeerd begrepen ?

<?php
$title = '</h1></body>';
?>
<body>
    <h1><?php echo htmlspecialchars($title); ?></h1>
    <p>Some content</p>
</body>




Dat gaat over OUTPUT escapen en niet over INPUT filteren. Dacht dat ik daar toch redelijk duidelijk over was...
Je creƫert zelf een variabele, en kijkt dan of deze variabele bestaat. Laat dit even bezinken :).

Gotcha: isset() kijkt of een variabele bestaat en of de waarde verschilt van null.

Doe je dus het volgende:
<?php
$test = null;
// isset($test) levert nu FALSE op
?>


Verdergaand op wat @Ben zei: escapen doe je doorgaans pas op het laatste moment, dus wanneer je het gaat gebruiken in HTML, SQL et cetera. Dit komt ook weer terug op de consequente werkhouding.

Stel dat we een veld $test uit jouw voorbeeld gaan gebruiken in HTML (checkbox is ff geen geslaagd voorbeeld dus een tekstveld):
<input type="text" name="test" value="<?php echo $test ?>">

Hoe kun je direct in dit voorbeeld zien of $test al ge-escaped is? Niet, je moet dan terug gaan zoeken in code. En als er geen escaping was, was dit dan bewust of per ongeluk vergeten? Als je afwijkt van de norm moet er altijd een annotatie gemaakt worden die je keuze onderbouwt en rechtvaardigt. Maar anders escape je op het laatste moment, zodat je direct kunt zien dat dit gebeurt:
<input type="text" name="test" value="<?php echo htmlspecialchars($test) ?>">


Tevens: htmlspecialchars($_POST['WerkA') -met als doel dit weer terug te plakken in een formulier- is sowieso ongewenst! Dit betekent immers dat je in hetzelfde stuk code een formulier aan het weergeven EN aan het verwerken bent. Dit zou voor de goede orde gescheiden moeten worden in compleet van elkaar geisoleerde acties/routines...

Reageren