Ik probeer een ledenbestand op te zetten met 4 velden. Naam, Voornaam, mailadres en paswoord.
Ik heb voor de Naam een pattern ingestoken (minstens 2 tekens en verder de gebruikelijke letters en spaties.
<input name="Naam" required pattern="[A-Za-z']+[A-Za-zéàèëäö'. ]{2,}" />

Maar dat werkt blijkbaar niet. Het is nog altijd mogelijk om een naam weg te schrijven die enkel uit 2 spaties bestaat. Dus eigenlijk leeg.
Ik heb al geprobeerd dit af te vangen via mijn code om het weg te schrijven naar mijn database. Maar ook dit lukt niet.
Er wordt nog altijd een leeg veld weggeschreven. Waar zit ik fout in mijn redenering.
if (!empty($naam) 
	|| !empty($vnaam) 
	|| !empty($email) 
	|| !empty($paswoord)) {
    $sql = "INSERT INTO Leden(Naam,Voornaam,mailadres,Paswoord) 
	VALUES ('$naam','$vnaam','$email','$paswoord')


Kortom wat kan ik doen om geen veld met alleen spaties weg te schrijven. Een naam zoals Van de Bossche moet wel kunnen. Daar zitten spaties in. Ik kan natuurlijk ook het minimum aantal in te voeren tekens verhogen naar 6 ofzo maar een naam als De Bo of Debo lukt dan niet meer.
Als het in de INPUT niet lukt, dan m.b.v een javascript, en als laatste redmiddel op de server.

 echo '<p>lengte : ' . strlen($_POST['Naam']) . '</p>';
$leeg = trim($_POST['Naam']);
echo '<p>lengte : ' . strlen($leeg) . '</p>';


[size=xsmall]Toevoeging op 05/01/2022 21:44:59:[/size]

En je kan bij de input een min en max lengte opgeven.
 <input minlength="10" maxlength="50" type="text" id="name" placeholder="Enter your login name" onkeyup="checkInputLength();">


[size=xsmall]Toevoeging op 05/01/2022 21:49:19:[/size]

En om het maar gelijk compleet te maken.
 <script>
function checkInputLength()
{
	document.getElementById("submit").disabled = true;

	var nameMinLength = document.getElementById("name").minLength;
	var nameValue = document.getElementById('name').value;
	if ( nameValue.length >= nameMinLength )
	{
		nameValueC = true;
	}
	else
	{
		nameValueC = false;
	}

	if ( nameValueC )
	{
		document.getElementById("submit").disabled = false;
	}
}
</script>


[size=xsmall]Toevoeging op 05/01/2022 21:58:56:[/size]

Nou, nog eentje dan.

https://www.w3schools.com/jsref/jsref_trim_string.asp
Hou er rekening mee dat een naam met 1 karakter ook bestaat, hoewel héél uitzonderlijk
pattern="[A-Za-z']+[A-Za-z'. ]

Ook weer jammer dan dat
Jan-Willem,
Zoë
René
ðalbjörn (ik hoop dat phphulp deze IJslandse naam kan weergeven)
en Þór
niet mee mogen doen.

Daar kun je de trim functie voor gebruiken.
En hopelijk schrijf je het niet meteen weg zoals in je voorbeeld!
zeker als je al expliciet toestaat dat in de naam een ' staat, heb je zonder escaping een probleem als je dat zo in de query plempt.

Maar in mijn browser (firefox) wordt een input van 2 spaties geweigerd
Ik weet niet wat er aan de hand is maar met dit pattern="[A-Za-z']+[A-Za-z'. ]" worden nog altijd 2 spaties aanvaard. Zowel in Chrome, als in Firefox.
En dan voor de verwerking doet dit het ook niet:
$naam = trim(mysqli_real_escape_string($conn, $_POST['Naam']));
$vnaam = trim(mysqli_real_escape_string($conn, $_POST['Voornaam']));
$email = trim(mysqli_real_escape_string($conn, $_POST['email']));
$paswoord= trim(md5(mysqli_real_escape_string($conn, $_POST['paswoord'])));
if (empty($naam)
	|| empty($vnaam) 
	|| empty($email)
	|| empty($paswoord)){
		//header("Location: fout01.php")
	
	else{
    $sql = "INSERT INTO Leden(Naam,Voornaam,mailadres,Paswoord) 


Het blijft maar wegschrijven.
doe een een var_dump($_POST) om te zien wat je binnen krijgt.

En paswoord moet je niet escapen: md5() zorgt al dat je een string overhoudt met alleen 0-9A-F erin.
Of de invoer van md5() nu alleen maar bestaat uit ' of uit de hele tekst van de handleiding van je koffiemachine.

(afgezien van het zwaar verouderd zijn van een password op deze manier te hashen.)

Probleem is, dat als je straks je password weer controleert en dan alleen md5() gebruikt, het werkt zolang iemand geen ' in zijn password heeft staan.

[size=xsmall]Toevoeging op 06/01/2022 11:32:09:[/size]

Ik denk trouwens dat je beter af bent met een filter op een minimale lengte (2?) en tekens die je beslist niet in een naam verwacht.
En dan denk ik aan cijfers en tekens als !@#$%^&*
Probeer niet om alle letters te vangen die je wél wilt zien, want A-Z dekt de lading niet, maar dan zit je ook nog met 10 verschillende accenten die al dan niet in combinatie op de raarste letters gezet kunnen worden.
Straks nog een beetje puzzelen. Het is eigenaardig als ik die pattern toepas op deze site: https://www.w3schools.com/tags/att_input_pattern.asp het wel werkt. Die md5 is een voorlopig probeersel, ik weet dat er betere zijn maar ik moet nog testen met de opmaak van mijn databasevelden. En paswoord veld zijn ook maar bepaalde tekens toegestaan.
Ik kom er wel uit en ondertussen leer ik heel veel.
"En paswoord veld zijn ook maar bepaalde tekens toegestaan."

Omgekeerd: in een password zou je aan een minimum aantal eisen moeten voldoen.
Dingen als :
* minstens 8 tekens
* Minstens 1 hoofd en 1 kleine letter
* een of meer cijfers
* en of meer "andere" tekens.

En zou geen enkele reden moeten zijn om een teken als $, ' of " te verbieden in een password of te eisen dat het hooguit 8 tekens lang is.
Zeker aangezien het password gehasht wordt, is er geen enkel veiligheidsissue mbt het opslaan van het password.
En later bij het inloggen wordt weer een vergelijk getrokken tussen de hash van het password bij het inloggen en wat in de database gehasht staat opgeslagen.

Uit praktisch oogpunt zou een password van 1024 tekens misschien lastig worden ivm een max aantal bytes dat de webserver kan aanpakken van de browser bij een POST, maar technisch moet dat geen probleem zijn.
Dat is ook zo hoor voor het paswoord. Dat is de pattern die gevraagd wordt: "(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}". Ik gebruik deze site een beetje als leiddraad: https://input-pattern.com/en/tutorial.php

[size=xsmall]Toevoeging op 07/01/2022 12:30:04:[/size]

Dit Pattern zorgt er blijkbaar voor dat je niet kan beginnen met spaties:
pattern="[A-Za-z'][A-Za-zéàèëäöç\s']{2,}"
. een gans leeg veld kan dus niet. een valse naam uiteraard wel en enkel 2 letters en de rest spaties kan ook. Maar het zal al ontmoedigen om dit te doen. Het komt er nu op neer dat er minimum moet begonnen worden met 2 letters of ' letter en voor de rest met de meest voorkomende letters uit onze taal.
Om in te loggen hebben ze enkel hun emailadres en paswoord nodig. Maar het mailadres kunnen we nog eens laten bevestigen, dus een vals of onbestaand kunnen we er dan zo uithalen. Misbruik kunnen we nooit helemaal uitsluiten, het moeilijk maken kunnen we wel.
Ik ben tevreden met het resultaat.

Reageren