Navigacija

Vartotojų tinkle

Prisijungusių svečių: 62
Prisijungusių narių: 0
Prisijungusių narių nėra

Registruoti nariai: 25,963
Naujausias narys: WolfHammer

Naujausi straipsniai

Paskutiniai nariai

DjArtas 6 dienos
WolfHammer 6 dienos
Rytis 4 savaitės
Nostesi11 savaitės
Wisedocs11 savaitės
asdasdddz15 savaitės
Paslapties K...16 savaitės
Audrius_1718 savaitės
Reikalas23 savaitės
Simbijanas31 savaitės
Karinacraft31 savaitės
Žmogus35 savaitės
Bruksnys39 savaitės
Darexs41 savaitės
Nepas42 savaitės
keistuole44 savaitės
Gizmis46 savaitės
MaFetas59 savaitės
ozzWANTED61 savaitės
saulyzas62 savaitės

Informacija:


OS: Unknown
Naršyklė: Nežinoma
IP: 216.73.216.80
Naujienų: 529
Straipsnių: 235
Temų: 52,589
Postų: 522,549
Postų pask. parą: 0
Shout'ų pask. parą: 0
P.S.C. pask. parą: 0
Nuorodų kataloge: 13

Lankomumo Statistika

Peržiūrų šiandien: 22

Iš viso peržiūrų: 22948724

Prisijungti

REGISTRUOTIS
Nario vardas

Slaptažodis



Pamiršai slaptažodį?
Paprašyk naujo

Aktyvuoti save

Šaukykla

Jei norite rašyti žinutes, turite prisijungti.

WolfHammer
2026 Sau. 25 01:01:35
drovus

Žmogus
2025 Geg. 31 10:05:18
Kas geresnio? šypsosi

Nepas
2025 Bal. 9 17:04:13
drovus

Nepas
2025 Bal. 9 17:04:08
drovus

Gizmis
2025 Kov. 15 14:03:50
OMG, smagu matyt sita puslapi veikianti

Šaukyklos archyvas

Apklausa

Ar esate patenkinti lietuviško vertimo kokybe?

Taip!

Taip, bet yra ką taisyti (parašysiu komentaruose)

Ne

Norėdamas balsuoti turite prisijungti.
Archyvas
Reklama 400x60
Apsauga nuo SQL Injection
Tarkim turime puslapį, kuriame yra tam tikra forma (pvz: registracijos, prisijungimo), kurioje įvesti duomenys tikrinami/įrašomi i SQL bazę (Kaip pavyzdį naudosiu prisijungimo formą). Vieno iš formos įvedimo laukelio vardas yra 'NAME', kuriame reikia įvesti prisijungimo vardą.
Taigi, tokio puslapio, kuris tikrina įvestus duomenis, SQL užklausa turėtų atrodyti daug maž taip:

SELECT laukeliu_pavadinimai
FROM table_pav
WHERE laukelio_pav = '$NAME';

(PHP pvz: mysql_query("'SELECT name,pass,email FROM users WHERE name='$name'");)

Čia $NAME yra puslapio kintamasis, kuris sudarytas iš formoj įrašyto prisijungimo vardo (PHP pvz: $NAME = $_POST['NAME'];).
Tikslų laukelių ar 'stalo' pavadinimo mes nežinom, bet tai tam tikromis užklausomis ir spėliojimais galima juos sužinot.
Pamėginus į prisijungimo formą įvesti atsitiktinius vardą ir slaptažodį, mums turėtų parodyti klaidą apie neteisingą slaptažodį ar vartotojo vardą. Jeigu pamėgintume vietoje vartotojo vardo įvesti Vardas', tada SQL užklausa atrodytų taip:

SELECT laukeliu_pavadinimai
FROM table_pav
WHERE laukelio_pav = 'Vardas'';

Tokia užklausą turėtų mums gražinti pranešimą apie sintaksės klaidą, kadangi užklausos pabaigoje yra dvi apostrofos. Jeigu tikrai gražino tokį pranešimą, reiškia puslapio informaciją nėra filtruojama ir puslapis pažeidžiamas, jei gražino kitokį pranešimą - puslapis saugus.

Dabar pasidarome užklausą kuri visada gražntų teigiamą reikšmę:

SELECT laukeliu_pavadinimai
FROM table_pav
WHERE laukelio_pav = 'Vardas' OR 'x'='x';

Kadangi x visados bus lygu x, tai ir ši užklausa visada bus 'true'. Su tokia užklausa praeinamas tik vartotojo vardo patikrinimas, iš tiesų ką gražins puslapis neaišku, tai lieka pačiam išssiaiškint pamėginus. Tarkim kad sistema mums gražino pranešima kad netinkamas slaptažodis (Vartotojo vardas atitiko, kadangi užklausa visa gražins 'true' tai neturi reikšmės kas parašytas vardas)

Taigi turime tris pranešimų tipus:

1. Neteisingas vardas. (paprasta, teisinga SQL užklausa)
2. Neteisingasa slaptažodis. (kai vartotojo vardas apeitas)
2. Sintaksės klaida. (blogai suformuluota SQL užklausa)

Iki šiol yra nežinomi lakuų pavadinimai ir nėra funkcijos kurį juos parodytų. Tad dabar prasideda spėliojimas. Pirma pasidaroma užklausa, kuri mums parodys ar SQL užklausa teisinga ir leis atspėti laukelių pavadinimus.

SELECT laukeliu_pavadinimai
FROM table_pav
WHERE laukelio_pav = 'x' AND email IS NULL; --';

Kadangi mums dabar vardas nerūpi, tai jis yra x. Čia 'email' yra spėjamo lauko pavadinimas. Jei gauname pranešimą kad SQL sintaksė bloga, vadinasi laukelio pavadinimas netoks, o jei gražina kad neteisingas vartotojas - vadinasi jau žinomas laukelio pavadinimas. Taigi taip atspėti galima ir kitus laukeliu pavadinimus.

Kadangi šis straipsins skirtas apsisaugoti nuo SQL Injection, tad nematau prasmės aiškint kaip viskas vyksta toliau, tik pateiksiu keletą pavyzdžių. Iš viso to jau turėtumete susidaryti bendrą vaizdą, kaip viskas vyksta.

SELECT laukeliu_pavadinimai
FROM table_pav
WHERE laukelio_pav = 'x'; UPDATE users SET email = 'lauzinetojo@email.addr' WHERE user = 'admin' ';

SELECT laukeliu_pavadinimai
FROM table_pav
WHERE laukelio_pav = 'x'; DROP TABLE users; --';


Apsisaugojimas.

Nuo viso to galima apsisaugoti labai paprastai - naudojant tam tikras funkcijas, kurios neleidžia kartotis apostrofom.
PHP tam skirta funkcija yra mysql_escape_string(); - ši funkcija visas apostrofas pakeis į ', todėl šios apostrofos nebus skaitomos kaip užklausos sintaksės dalis.

Ʋinoma yra ir kitų būdų kaip apsisaugot. Pvz.: galima su Regular Expresions patikrint ir neleisti įvesti tokių simbolių kaip apostrofos, arba dar galima iš įvedamo teksto ištrinti tokius simbolius.


Straipsnio informacija

Autorius
N3PST3R
Parašymo data
2006 spalio 1 18:10:49
Komentarų
5
Skaityta
6194
Spausdinti Spausdinti
Komentarai
tadukas1 2008 gruodžio 10 22:12:40
kur sita koda reikia irasyti ?
drakonas34 2009 liepos 16 15:07:15
jo nežino
almantsas 2010 kovo 26 21:03:11
Kur reik rasyt mysql_escape_string(); ?
allenas. 2010 rugpjūčio 10 18:08:15
Visai neaiškus straipsnis. nežino
tevas 2010 rugpjūčio 19 21:08:00
visko norit padaryto jau
Rašyti komentarą
Prisijunkite, norėdami parašyti komentarą.
Reitingai
Balsuoti gali tik nariai.

Prašome prisijungti arba prisiregistruoti.

Nuostabu! Nuostabu! 0% [Nėra balsų]
Labai gerai Labai gerai 0% [Nėra balsų]
Gerai Gerai 0% [Nėra balsų]
Patenkinamai Patenkinamai 0% [Nėra balsų]
Blogai Blogai 100% [3 Balsų]