Newsgroup: it.comp.www.php
Titolo: Fregare l'operatore di uguaglianza

Ciao a tutti,
i valori passati tramite POST (o GET, o COOKIE) possono soltanto essere
stringhe ed array? Come faccio a passare un valore intero, per esempio?
Il problema è il seguente:
var_dump(0 == "abcdkdkddswad"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("1" == "1e0"); // 1 == 1 -> true
var_dump("700" == "+700"); // true 
io vorrei che una variabile POST si comporti come il primo esempio:
var_dump($_POST['test'] == "abcdkdkddswad"); // 0 == 0 -> true
Senza passare ovviamente test=abcdkdkddswad nella POST :)
Mentre invece mi restituisce false, perchè se passo test=0 php si comporta
come se:
var_dump("0" == "abcdkdkddswad"); // false
-- 
g4b0, linux user n. 369000
http://gabo.homelinux.com

attivi il cervello e sfogli il manuale
http://www.php.net/manual/en/function.intval.php

 
http://www.php.net/manual/en/function.intval.php
Punto primo:
Il mio cervello è attivo di default, forse è il tuo che sonnecchia e non ha
capito la domanda.. Comunque sia l'educazione dovrebbe sopperire alle
mancanze di ciascuno.
Punto secondo:
Riformulo la domanda: Io non posso modificare il codice sorgente, devo
passare semplicemente un parametro che dal lato server deve essere visto
come un intero, e non come una stringa.
E' una sorta di code-injection, sql-injection, vedetela un po come
preferite..



"If you compare an integer with a string, the string is converted to a 
number. If you compare two numerical strings, they are compared as 
integers."
Dovrebbe quindi dipendere dalle stringhe in questione, non è chiaro se 
il confronto viene effettuato tra due stringhe di cui una sola è 
numerica cosa succeda.
Da un veloce controllo sembra restituire falso anche per "0" == "ciao" 
anche se "1a0" == 0 e "a10" == 0 danno false e true rispettivamente, il 
controllo sul primo carattere è importante, evidentemente.

 controllo sul primo carattere è importante, evidentemente.
Esatto, ma io devo confrontare un md5 con quello che gli passo nel post..
quindi, a patto che si possa 'iniettare' un intero, basterebbe iniettare 0
nel caso l'md5 iniziasse con una lettera, ed il numero esatto nel caso in
cui l'md5 iniziasse con una cifra.
Quindi in questo caso un bruteforce su di un md5 si limiterebbe al massimo a
10 tentativi!!
O sbaglio?


 O sbaglio?
Non lo so.

 Non lo so.
Chi lo sa? ;)


stringhe ed array? Come faccio a passare un valore intero, per esempio?
Non puoi.
Cosa stai cercando di fare in generale? Validare un input, bucare un
server, scrivere un articolo?
Leonardo
-- 
While ordinarily valid that being widespread does not make a statement
true, I feel that the diffusion of anti-evolutionary beliefs does pose
a strong argument for Darwin having been, indeed, sorely mistaken.

 server, scrivere un articolo?
La terza.


Basta usare '===' no?
Si' e no. Per le stringhe ti funziona; per gli interi no, nel senso che a
quel punto devi scrivere
	if ($_POST['i'] === "1")
anziche' 
	if ($_POST['i'] === 1)
che potrebbe essere piu' intuitivo. Se passi "1" in _POST, ti arriva "1",
e non 1, e
	"1" === 1
e' falsa.


Sicuro al 100%?
Sicuro al 100%. I dati vengono passati come stringhe e $_REQUEST, $_GET e
$_POST sono tutti tipi stringa (basta tu lo chieda a PHP).
Quindi se scrivi nell'URL "test=0", quello 0 e' una stringa.
Fermo restando che lato server un controllo numerico andrebbe fatto e che
in caso contrario possono esserci anche problemi di sicurezza:
	switch($_REQUEST['test'])
	{
		case 0:
			Qui finisco con test="0", test="0xFA", test="XX"
		case 1:
			Qui finisco con test="1", test="1ciccio", ...
		...
	}
Non si verifica mai quindi che io gli possa passare un intero, es. 0, che
quindi passerebbe il test
	if ($_GET['test'] == "abcde")
grazie al fatto che, numericamente, "abcde" vale zero.
Come buona regola comunque un test del genere andrebbe scritto
	if ("abcde" == $_GET['test'])
per individuare errori di battitura ("=" al posto di "==") e questo AFAIK
rende il test comunque un test fra stringhe (dovrei controllare, pero'...
non ne sono certo, e' solo una cosa che penso :-) ).


 Sicuro al 100%?
Ma hai presente come funziona PHP? Nel mezzo c'e' un richiesta HTTP.
Il fatto che "0" possa essere sia la codifica di un numero intero, o
di una stringa contenente il carattere "0", o ancora la
rappresentazione di un valore logico false, è una caratteristica
valida all'interno dell'interprete php. Ma i valori passati da un form
sono passati da un client attraverso il protocollo HTTP, che prevede
il passaggio di valori nei metodi GET o POST attraverso la query
string (che già il fatto che si chiami così...). Quando php riceve la
query string fa il possibile per interpretarla, e costruire l'array
$_REQUEST, ma come potrebbe la originale natura di quello "0"
sopravvivere una volta che è stato infilato in una query string e
nuovamente ri-decodificato?
Programmaticamente se vuoi puoi forzare il type delle variabili che
ricevi dalla query string (operazione ovviamente obbligatoria con i
linguaggi strong-typed, ma in php si può saltare), verificare se
possono essere di un type o di un altro, ma se il tipo della variabile
non è ovvio dalla sua rappresentazione o lo forzi basandoti su altri
presupposti, o lo consideri di tipo "stringa" che è l'unico che va
sempre bene.
Se poi queste considerazioni sono fuori luogo rispetto a quello che è
il tuo problema, spiegati meglio che ancora quello che vuoi fare di
preciso non s'e' capito granchè.
bye!
bye!