Vermijden dat een veld met alleen spaties wordt weggeschreven

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ignace Verschaeve

Ignace Verschaeve

05/01/2022 21:31:55
Quote Anchor link
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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
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.
 
PHP hulp

PHP hulp

26/12/2024 00:41:57
 
Adoptive Solution

Adoptive Solution

05/01/2022 21:41:56
Quote Anchor link
Als het in de INPUT niet lukt, dan m.b.v een javascript, en als laatste redmiddel op de server.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
echo '<p>lengte : ' . strlen($_POST['Naam']) . '</p>';
$leeg = trim($_POST['Naam']);
echo '<p>lengte : ' . strlen($leeg) . '</p>';


Toevoeging op 05/01/2022 21:44:59:

En je kan bij de input een min en max lengte opgeven.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<input minlength="10" maxlength="50" type="text" id="name" placeholder="Enter your login name" onkeyup="checkInputLength();">


Toevoeging op 05/01/2022 21:49:19:

En om het maar gelijk compleet te maken.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<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>


Toevoeging op 05/01/2022 21:58:56:

Nou, nog eentje dan.

https://www.w3schools.com/jsref/jsref_trim_string.asp
Gewijzigd op 05/01/2022 21:50:35 door Adoptive Solution
 
Jan R

Jan R

06/01/2022 07:07:43
Quote Anchor link
Hou er rekening mee dat een naam met 1 karakter ook bestaat, hoewel héél uitzonderlijk
 
Ivo P

Ivo P

06/01/2022 10:48:02
Quote Anchor link
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.
Gewijzigd op 06/01/2022 10:48:53 door Ivo P
 
Ralf d

Ralf d

06/01/2022 11:07:51
Quote Anchor link
Daar kun je de trim functie voor gebruiken.
En hopelijk schrijf je het niet meteen weg zoals in je voorbeeld!
 
Ivo P

Ivo P

06/01/2022 11:10:26
Quote Anchor link
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
 
Ignace Verschaeve

Ignace Verschaeve

06/01/2022 11:22:33
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
$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.
 
Ivo P

Ivo P

06/01/2022 11:29:03
Quote Anchor link
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.

Toevoeging op 06/01/2022 11:32:09:

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.
 
Ignace Verschaeve

Ignace Verschaeve

06/01/2022 11:52:57
Quote Anchor link
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.
 
Ivo P

Ivo P

06/01/2022 12:26:26
Quote Anchor link
"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.
 
Ignace Verschaeve

Ignace Verschaeve

06/01/2022 17:56:02
Quote Anchor link
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

Toevoeging op 07/01/2022 12:30:04:

Dit Pattern zorgt er blijkbaar voor dat je niet kan beginnen met spaties:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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.
 
Ralf d

Ralf d

08/01/2022 01:30:23
Quote Anchor link
Ignace Verschaeve op 06/01/2022 11:22:33:
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
$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.


Ik weet 100% zeker dat de trim functie in php een spatie voor en na de input weghaalt.
Dus ik neem aan dat 2 spaties geen probleem is.
Als je eerst de trim functie gebruikte en dan pas de escape.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$naam = trim($_POST['Naam'];
$naam = mysqli_real_escape_string($conn, $naam));


Daarnaast gebruik je een if statement die alleen naar OR kijkt terwijl het zou moeten zijn EN.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
if (!empty($naam)
    && !empty($vnaam)
    && !empty($email)
    && !empty($paswoord)) {
    $sql = "INSERT INTO Leden(Naam,Voornaam,mailadres,Paswoord)
    VALUES ('$naam','$vnaam','$email','$paswoord')


Ik zou aanraden om de allemaal appart te checken zodat je kan aangeven wat ze niet ingevuld hebben.
Of foutief ingevuld.

En kijk aub niet naar wat Leden invoeren maar wat je zelf doorzet naar de database.
Gewijzigd op 08/01/2022 01:32:35 door Ralf d
 
- Ariën  -
Beheerder

- Ariën -

08/01/2022 01:37:10
Quote Anchor link
Liever dus per stuk controleren in losse if-statements, en alle foute invoer verzamelen in een array.
Bij het verzenden van je formulier bekijk je of die array waardes van foute invoer bevat (count($errors) >0). In dat geval laat je zien aan de gebruiker welke velden er missen of fout ingevoerd zijn. Als alles ingevuld is mag de database zijn werk doen.


Of..... je gebruikt gewoon een kant en klaar product, zoals deze class :P
https://github.com/SandroMiguel/verum-php

Dan kan je gewoon met een klein stukje code en een array een validatie maken.
De Nederlandse vertaling is aan mijzelf te danken. ;-)
Gewijzigd op 08/01/2022 01:43:17 door - Ariën -
 
Ignace Verschaeve

Ignace Verschaeve

08/01/2022 15:23:07
Quote Anchor link
@Ariën. We gaan dat laatste eens proberen.
@Ralf d. Die If die je voorstelt werkt al zeker niet want als er eentje ingevuld is dan schrijft het weg. Ik had het daarom al omgedraaid. Als Naam Of Voornaam of email of paswoord leeg is dan terug naar invulformulier in het ander geval wegschrijven. Maar om de ene of andere reden lukt dit niet. Ik denk dat het eigenlijk een XOR zou moeten zijn.
 
Ralf d

Ralf d

09/01/2022 00:40:07
Quote Anchor link
Ignace Verschaeve op 08/01/2022 15:23:07:
@Ariën. We gaan dat laatste eens proberen.
@Ralf d. Die If die je voorstelt werkt al zeker niet want als er eentje ingevuld is dan schrijft het weg. Ik had het daarom al omgedraaid. Als Naam Of Voornaam of email of paswoord leeg is dan terug naar invulformulier in het ander geval wegschrijven. Maar om de ene of andere reden lukt dit niet. Ik denk dat het eigenlijk een XOR zou moeten zijn.


Dat die niet werkt dat zou zeker kunnen!
Zou dat zelf namelijk nooit doen.
Geef daarna ook aan dat je deze beter appart in een if statement kunt zetten.
En bij iedere if een fout afhandeling.

Pas bij de laatste naar de database schrijven.
het wordt hierboven al duidelijk uit gelegd.
Gewijzigd op 09/01/2022 00:42:10 door Ralf d
 
- Ariën  -
Beheerder

- Ariën -

09/01/2022 00:55:43
Quote Anchor link
Laat eens zien wat je nu hebt aan relevante code.
 
Ignace Verschaeve

Ignace Verschaeve

09/01/2022 10:05:44
Quote Anchor link
Ik kom er nog op terug. Maar de eerstvolgende dagen moet ik nog correcties doen in de databases. Die zijn gebaseerd op reeds bestaande indexen. Momenteel zijn vrijwilligers zo'n 20 000 scans aan het koppelen (van huis uit on line) met die indexen zodat gebruikers die scans kunnen opvragen on line. En daar komen nogal wat fouten tevoorschijn in de bestaande indexen. Die worden mij gemeld en die corrigeer ik dan want ik laat niet iedereen in de tabellen rommelen. Maar ik mag het ook niet te lang laten liggen want dan wordt het uit het oog verloren. Dus dit is nu voor een paar dagen on hold.
 
- Ariën  -
Beheerder

- Ariën -

09/01/2022 10:12:53
Quote Anchor link
Succes. Geef maar een schreeuw als je weer verder gaat ;-)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.