Autor Zpráva
Hacker
Profil *
$query = MySQL_Query("SELECT * FROM `users` WHERE `user` = '$user' and `password` = '$password'") or die (mysql_error());

mam kod a neviem ako ho mam ochranit aby nemohol uzivatel zadavat znaky ' ,# , OR , AND
nightfish
Profil
mysql_real_escape_string ti pomůže (minimálně s apostrofem)
zadání AND, OR nebo # v SQL dotazu je neškodné

EDIT: (označen kurzívou)
Mike8748
Profil
pomoci str_replace dany texty nahradit v promenych $user a $password za prazdnej znak, pak teprve to pouzit v query
HACKER
Profil *
a co je z obou lepsi ???
Aleš Janda
Profil
HACKER
Ten od nightfish.

Já to dělám tak, že řetězce escapuju a k číslu přičítám nulu.
HACKER
Profil *
Aleš Janda
a nestaci to jenom escapovat
Aleš Janda
Profil
Pokud je dotaz typu
$dotaz = 'SELECT * FROM tabulka WHERE cislo = '.mysql_real_escape_string($_GET['cislo']);

a do $_GET['cislo'] dám třeba
1 OR 1 = 1

hádej co ten dotaz udělá ;-)

Leda že bys i čísla dával do uvozovek/apostrofů, ale to se mi nezdá jako dobrá konvence..
Timy
Profil
Aleš Janda
…a k číslu přičítám nulu.
Nestačí třeba intval()?
Aleš Janda
Profil
Timy
Stačí :-) Pokud se nejedná o FLOAT (což se většinou nejedná).
Obojí je obrana proti SQL Injection.
starenka
Profil
a pro jistotu prehod poradi loginu a hesla :>
Aleš Janda
Profil
starenka
proč?
starenka
Profil
nevim... to byl vtip ;) escapuj a nebudes mit problem...

jinak tohle je dobry pocteni... http://skola.security-portal.cz/%5BRubberDuck%5D-SQL_Injection.txt
suky
Profil
HACKER
Tady je tak dobry pocteni. (link)
Joker
Profil
Timy
Nestačí třeba intval()?
Já si taky říkám, co je špatného na intval(), že se mu tady většina lidí vyhýbá :-)

Jinak Hacker
dost záleží na tom, co je obsahem těch proměnných $user a $password.
Když bude třeba:
$password = md5($_GET["password"]);
tak přes tohle žádný nebezpečný znak neprojde.
DoubleThink
Profil *
Leda že bys i čísla dával do uvozovek/apostrofů, ale to se mi nezdá jako dobrá konvence..
Ale to je jediná správná konvence - i u číselných datových typů.
Aleš Janda
Profil
DoubleThink
Ale to je jediná správná konvence - i u číselných datových typů.

Zdroj?

Pokud si pamatuju, standard SQL číslo v uvozovkách nepřipouští, je to pouze benevolence MySQL. Takže při případném přechodu třeba na PostgreSQL vznikne problém. Navíc to není žádná vychytávka, která by něco usnadňovala, jen prostě jiná konvence, takže nevidím důvod, proč to tak používat.
Mastodont
Profil
DoubleThink
To tedy rozhodně není dobrý zvyk, viz Janda.
DoubleThink
Profil *
Navíc to není žádná vychytávka, která by něco usnadňovala
Naopak. Je to legitimní, nezavržený způsob zápisu.
Máš naprostou kontrolu nad hranicemi a tvarem vstupních dat. To že to není úplně košér je podle mě nerelevantní.

To tedy rozhodně není dobrý zvyk
A to v praxi protože ... ?
Aleš Janda
Profil
DoubleThink
V čem je teda ta výhoda? Čísla nemívají příliš dlouhý zápis, navíc je dávám zpravidla v úplně jiném kontextu.
Skoro bych řekl, že (alespoň pro mě) je přehlednější tvar bez uvozovek, protože snadno rozeznám číslo od řetězce.

Le to legitimní, nezavržený způsob zápisu.
To, že něco není zavrženo, automaticky neznamená, že je to dobré ;-)
suky
Profil
Aleš Janda
Skoro bych řekl, že (alespoň pro mě) je přehlednější tvar bez uvozovek, protože snadno rozeznám číslo od řetězce.
A jeste k tomu s tim PHP pracuje urcite jinak nez s retezcem, rychleji...
HACKER
Profil *
Joker
kdys ale nekdo zada usera admin'/* tak presto prejde kdys nekontroluje jestly zadal do password vubec nic
Aleš Janda
Profil
suky
A jeste k tomu s tim PHP pracuje urcite jinak nez s retezcem, rychleji...
Tak to zas rozhodně ne, když porovnáváš číselný sloupec s řetězcem, převede optimalizátor řetězec, ne celý sloupec. Pak už se pracuje jenom s číslem (a optimaizátor tam je tak jako tak - a tohle je fakt triviální úkon). Takže myslím, že rychlost bude naprosto stejná.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: