Kleine Vragen Topic #3

Gestart doorStef2.514 reacties9.659 weergaven

2.515 berichten · pagina 45 van 168

Berichten
4.214
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Aarclay schreef:
Eerdere citaten tonen
Dylanh schreef:
Ik gebruik altijd gewoon if(isset($_POST[name]))
En dat raad ik juist af...
- Enter werkt dan vaak niet.
- Sommige browsers sturen die POST-waarde niet goed mee.
- Mensen kunnen met simpel hack-werk zelfs PHP-notices naar voren trekken.

Het beste advies om gewoon te kijken naar $_SERVER[REQUEST_METHOD], en of deze POST is.
Daarna kan je eventueel wel kijken naar isset(), zolang je maar wel naar die $_SERVER-variabele kijkt. smile
Lees ook eens dit:
http://www.pfz.nl/wiki/isset-vs-request-method/
Oke, naar mijn weten zijn alle 3 die punten onzin.

- Wat heeft de enter toets te maken met het script achter de HTML?
- Je doelt op submit in Internet Explorer? Ik neem aan dat je niet met isset naar een submit button kijkt maar naar alle waarde die ingevuld kunnen worden.
- Ik ben heel benieuwd welke notices. Ik kan hier niets van op Google vinden en gezien de werking van isset lijkt me dit ook onmogelijk.

Wat betreft request method vs isset. Request method vind ik altijd overbodig omdat ik toch via isset daarna elk veld moet controleren, bij deze controle kun je ook erg handig concluderen dat de POST niet (juist) is gedaan.
0
Berichten
3.532
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
iemand nog een login systeem gewoon simpel?

en anders heeft iemand een kleine uitleg over hoe ik het maak?
0
Berichten
14.025
Reputatie
1
Punten
0,01
Lid sinds
Laatst gezien
Jep, ik doe ook gewoon alles controleren:

Codeblok (voorbeeld.php):

1

if(isset($_POST[username], $_POST[password], $_POST[password2], $_POST[email],$_POST[legal])) {
0
Berichten
10.421
Reputatie
4
Punten
0,00
Lid sinds
Laatst gezien
1- Het is een behaviour van de browser. Niet elke browser gaat er goed mee om, voornamelijk vanwege het feit dat het script via een omweg wordt aangeroepen. Gewoon goed en robuust scripten, dan heb je dat gedoe niet.

2 - Je moet gewoon kijken naar het formulier. Dat is de scope, die knopjes zijn bijzaak.

3 - Als ik het goed heb kan je een formulierveld manipuleren, wat in sommige gevallen een notice-melding kan uitspugen. Niet geprobeerd, maar mij lijkt het logisch.

Lees die tut anders eens goed door. hij is door een aantal Zend certified developers geschreven, en ook tijdens die training hakken ze die $_SERVER[REQUEST_METHOD] er bij iedereen in.
Laks zijn kan altijd, maar je schiet er uiteindelijk niks mee op. Leuk punt om je kennis eens op bij te schaven wink.

(hadden we deze discussie anderhalf jaar geleden ook niet?)

toevoeging op 25 april 2014, 18:48:29:
Jespar schreef:
iemand nog een login systeem gewoon simpel?

en anders heeft iemand een kleine uitleg over hoe ik het maak?

Ik gaf je toch een link? Kijk daar eens naar smile
toevoeging op 25 april 2014, 18:49:29:
Dylanh schreef:
Jep, ik doe ook gewoon alles controleren:
Codeblok (voorbeeld.php):

1

if(isset($_POST[username], $_POST[password], $_POST[password2], $_POST[email],$_POST[legal])) {

Dat kan ook, maar dan moet je wel consequent zijn en niks vergeten. Dan is $_SERVER[REQUEST_METHOD] == "POST" een stuk makkelijker. Je moet zelf weten, maar echte ontwikkelaars raden die manier ook aan, als je robuuste code wilt schrijven.
0
Berichten
14.025
Reputatie
1
Punten
0,01
Lid sinds
Laatst gezien
Quote:
Dan loop je het risico op de volgende foutmelding:

"Warning: htmlspecialchars() expects parameter 1 to be string, array given in __FILE__ on line 3".
Dit probleem ontstaat doordat je niet controleert of hetgeen iemand naar jouw pagina stuurt wel werkelijk is wat jij verwacht. Dit is netjes op te lossen door te controleren of je ook wel alles krijgt wat je verwacht.

Een voorbeeld van een nette totaaloplossing is:
Spoiler tonen
Codeblok (voorbeeld.php):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143

?php
$bShowForm = true;
# Als deze niet bestaan, kun je er vanuit gaan dat het formulier niet via de officile pagina is verstuurd
if ( isset( $_POST[mail], $_POST[username], $_POST[password], $_POST[repassword], $_POST[age], $_POST[postalcode] ) )
{
$asErrors = Array(); # Een array aanmaken van strings, waarin de foutmeldingen van het formulier komen

# Mailadres
if ( !is_string( $_POST[mail] ) || !preg_match( #A[-_a-z0-9+*$^&%=~!?{}]++(?:.[-_a-z0-9+*$^&%=~!?{}]+)*+@(?frown?![-.])[-a-z0-9.]+(? {
$asErrors[] = Vul a.u.b. een valide mailadres in.;
}

# Gebruikersnaam
if ( is_string( $_POST[username] ) )
{
$sUsername = trim($_POST[username]);
if ( strlen( $sUsername ) < 3 )
{
$asErrors[] = Vul een gebruikersnaam in van minimaal drie tekens lang!;
}
elseif ( strlen( $sUsername ) > 10 )
{
$asErrors[] = Vul een gebruikersnaam in die niet langer is dan tien tekens!;
}
}
else
{
$asErrors[] = Vul een valide gebruikersnaam in!;
}

# Wachtwoord
if ( !is_string( $_POST[password] ) || !is_string( $_POST[repassword] ) )
{
# Hoogswaarschijnlijk hackwerk.
$asErrors[] = Vul valide wachtwoorden in!;
}
elseif ( $_POST[password] != $_POST[repassword] )
{
$asErrors[] = De wachtwoorden die u invulde komen niet overeen!;
}
elseif ( ( strlen($_POST[password] ) < 4 ) || !preg_match( #A([a-z]*[0-9]){2,}[a-z]*z#i, $_POST[password] ) )
{
$asErrors[] = Uw wachtwoord moet minimaal 4 tekens lang zijn en dient cijfers en letters te bevatten!;
}

# Leeftijd
if ( !is_string( $_POST[age] ) || !ctype_digit( $_POST[age] ) )
{
$asErrors[] = Vul een valide leeftijd in;
}
elseif( (int)$_POST[age] > 100 )
{
$asErrors[] = De uiterste leeftijd die geaccepteerd wordt, is 99 jaar!;
}

# Postcode (niet verplicht)
if ( !is_string( $_POST[postalcode] ) || !preg_match( #A[1-9]d{3}[a-z]{2}z#i, $_POST[postalcode] ) )
{
$_POST[postalcode] = ;
}

if ( count( $asErrors ) > 0 )
{
echo
De verwerking van het formulier heeft een aantal fouten opgeleverd
    ;
    foreach ( $asErrors as $sError )
    {
    echo
  • . htmlspecialchars( $sError ) .
  • ;
    }
    echo
;
}
else
{
$bShowForm = false;

# Hier zou je nog dingen kunnen doen als vooraf controleren of een gebruikersnaam al bestaat (kan evt. ook achteraf, door de mysql-errorno op te vragen). Voor het voorbeeld even niet gedaan.
$query = "INSERT INTO
users
(
name
, password
, age
, postalcode
, signupdate
)
VALUES
(
" . mysql_real_escape_string( $_POST[username] ) . "
, " . sha1( $_POST[password] ) . "
, " . mysql_real_escape_string( $_POST[age] ) . "
, " . mysql_real_escape_string( strtoupper( $_POST[postalcode] ) ) . "
, CURRENT_DATE
)";
$result = mysql_query( $query );
if ( false === $result )
{
echo
Door een fout met de database kon u niet worden toegevoegd als lid. Sorry voor het ongemak!
;
}
else
{
echo
U bent toegevoegd als lid aan de database
;
}
}
}

if( $bShowForm )
{
?>


}
?>[/code[/spoiler]][/quote]
0
Berichten
4.214
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Aarclay schreef:
1- Het is een behaviour van de browser. Niet elke browser gaat er goed mee om, voornamelijk vanwege het feit dat het script via een omweg wordt aangeroepen. Gewoon goed en robuust scripten, dan heb je dat gedoe niet.

2 - Je moet gewoon kijken naar het formulier. Dat is de scope, die knopjes zijn bijzaak.

3 - Als ik het goed heb kan je een formulierveld manipuleren, wat in sommige gevallen een notice-melding kan uitspugen. Niet geprobeerd, maar mij lijkt het logisch.
1. Nogmaals, hoe kan een browser weten of je isset of request method gebruikt? Dat heeft niets te maken met of je op een knop drukt of op enter drukt

2. Dat doe je met isset neem ik aan? Zou niet weten hoe request method jouw vertelt of het veldje gebruikersnaam en password in de POST headers zitten.

3. Nee, de inhoud maakt voor isset niet uit, zolang er maar inhoud in zit. En al zou dit kunnen dan zou het bij de eerst volgende versie van PHP gemaakt zijn.
Aarclay schreef:
toevoeging op 25 april 2014, 18:49:29:
Dylanh schreef:
Jep, ik doe ook gewoon alles controleren:
Codeblok (voorbeeld.php):

1

if(isset($_POST[username], $_POST[password], $_POST[password2], $_POST[email],$_POST[legal])) {

Dat kan ook, maar dan moet je wel consequent zijn en niks vergeten. Dan is $_SERVER[REQUEST_METHOD] == "POST" een stuk makkelijker. Je moet zelf weten, maar echte ontwikkelaars raden die manier ook aan, als je robuuste code wilt schrijven.

Waarom zou request method jou garantie geven dat alle velden op de website zijn ingevuld? Ik kan zomaar een POST request sturen met keys zoals aapjes en bloemen terwijl jouw site username en password verwacht en dan zou request method dat zomaar accepteren. In het geval van request method zou je naderhand alsnog met isset moeten controleren of daadwerkelijk de juiste velden zijn gepost.

Het zou een beetje overkill zijn om het beide te doen terwijl isset uiteindelijk ook tot de conclusie komt dat er niets of niet het juiste is gepost.
0
Berichten
10.421
Reputatie
4
Punten
0,00
Lid sinds
Laatst gezien
Quote:
Waarom zou request method jou garantie geven dat alle velden op de website zijn ingevuld?

Dat zeg ik ook niet. Als je mijn verhaal eens vollediger zou lezen, dan moet moet je weten dat je dan alsnog isset moet doen. Maar ik ken toch echt bugs waarin een isset($_POST[submit]) alleen echt problemen gaf met ENTER. Hoe en wat geen idee, maar ben er wel eens tegenaan gelopen. Vandaar dat ik netjes $_SERVER[REQUEST_METHOD] gebruik.

Probeer het anders zelf eens? Het is althans mijn manier, en ik ben er zeker van dat het de beste manier is. Ik heb het ook van vele andere developers gehoord, dus waarom niet met hen meegaan?
0
Berichten
4.214
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Aarclay schreef:
Quote:
Waarom zou request method jou garantie geven dat alle velden op de website zijn ingevuld?

Dat zeg ik ook niet. Als je mijn verhaal eens vollediger zou lezen, dan moet moet je weten dat je dan alsnog isset moet doen. Maar ik ken toch echt bugs waarin een isset($_POST[submit]) alleen echt problemen gaf met ENTER. Hoe en wat geen idee, maar ben er wel eens tegenaan gelopen. Vandaar dat ik netjes $_SERVER[REQUEST_METHOD] gebruik.

Probeer het anders zelf eens? Het is althans mijn manier, en ik ben er zeker van dat het de beste manier is. Ik heb het ook van vele andere developers gehoord, dus waarom niet met hen meegaan?
"Dat kan ook, maar dan moet je wel consequent zijn en niks vergeten. Dan is $_SERVER[REQUEST_METHOD] == "POST" een stuk makkelijker." Je zegt het wel, in deze zin zeg je dat je geen enkel veld mag vergeten in isset maar dat enkel $_SERVER[REQUEST_METHOD] == "POST" wel zou voldoen. Maar goed dat is niet belangrijk.

Die submit is een fout in IE maar waarom zou je controleren of er iets met een button is gedaan? Dat is echt totaal niet nuttig, het gaat immers om de post velden zelf isset($_POST[naam], $_POST[wachtwoord]) geeft als de request geen POST is een false, is er een POST maar komen naam en wachtwoord niet voor in de headers dan geeft hij een false, zijn zowel naam als wachtwoord aanwezig in de post dan krijg je een true.

Met $_SERVER[REQUEST_METHOD] maak je dus een onnodige stap omdat de isset dat ook prima controleert of de request wel degelijk een POST request is, isset maakt gelijk al de volgende stap voor je zet door te controleren of de juiste POST velden ook daadwerkelijk zijn gesubmit.

Hoe jij erbij komt dat dat de beste manier is snap ik dus niet helemaal. Het is een beetje zoals eerst een real escape in een variable zetten in plaats van direct in de query.
0
Berichten
10.421
Reputatie
4
Punten
0,00
Lid sinds
Laatst gezien
Het is niet alleen de beste manier, maar ook de logische manier. Een deur maak je met de deurklink open, niet met een schroevendraaier. Naar mijn mening is en blijft $_SERVER[REQUEST_METHOD] == "POST" gewoon de beste manier, en ik ben niet de enige die bij mijn standpunt staat.

Dat je moet controleren of je velden zijn ingevuld, kan daarna prima met isset, hoewel ik zelf zou controleren op een lege spatie en trim(), maar dat heeft meer met validatie te maken dan een controle of een formulier verstuurd is. Dus $_SERVER[REQUEST_METHOD] is mijn ogen totaal niet overbodig. Omdat je dan het versturen van je formulier en de validatie gescheiden houdt.
Verder wil je niet controleren op je HTML (die eenvoudig aan te passen is), maar op je actie. (POST)

Ik heb al uitleg en diverse linkjes gegeven, maar betwijfel of je het allemaal gelezen hebt. Verder is het aan iedereen wat diegene het beste voor zichzelf vindt. Ik kan iemand natuurlijk niet dwingen om een andere techniek te gebruiken.
0
Berichten
3.532
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
er was toch ook een ledensysteem van eleky ofzo gereleased?
0
Berichten
10.421
Reputatie
4
Punten
0,00
Lid sinds
Laatst gezien
ja, uit 2010. Die zal inmiddels wel enige revisie nodig hebben, en verder was die betaald.
0
Berichten
11.263
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Ik heb dus een textarea, maar die zet er onnodige spaties voor. Die ook niet opgegeven staan inde database;
Afbeelding

Zo voeg ik het in;

Codeblok (voorbeeld.php):

1

mysqli_query($connect,"UPDATE algemeen SET kladblok= ".trim($_POST[kladblok])."");

Codeblok (voorbeeld.php):

1

echo trim($row[kladblok]);

en zo print ik het uit.
Ik hoop dat iemand weet hoe ik die spaties er voor wegkrijg...
Want in de database staat het zonder spaties
0
Berichten
14.025
Reputatie
1
Punten
0,01
Lid sinds
Laatst gezien
Met trim() haal je juist spaties weg?
0
Berichten
11.263
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Dylanh schreef:
Met trim() haal je juist spaties weg?
Doet ie nochtans niet cry
0
Berichten
10.421
Reputatie
4
Punten
0,00
Lid sinds
Laatst gezien
Die tekst in de textarea, komt die ook uit de database, of wordt deze als eerste ingetypt?
Want als je een enter in je code hebt staan om je data met PHP op te halen, dan kan je ook een sloot tabs en spaties krijgen.
0

Jouw reactie

Deel je idee, stel een vraag of help een ander verder.

Editor laden…

Praat mee met de One2xs-community.

Inloggen om te reageren