PHP és MySQL adattípus túlcsordulások

Azt ügye tudjuk, hogy a PHP-ben automatikus típuskonverzió van, amire oda kellene figyelni. A PHP-ban a számok ábrázolására 2 típus áll rendelkezésre (+boolean):
– (signed) integer
– (signed) float

Ezek minden esetben előjellel vannak ellátva, így az integer típusban maximum 2^63 érték tárolható egy 64 bites rendszeren, 64 bites PHP-val. Viszont! A MySQL-ben rendelkezésre áll az előjel nélküli változat, az unsigned bigint, ami ugyanezen körülmények között 2^64 tud ábrázolni, előjel nélkül. Így marad egy nagy hézag a kettő között.  Mivel a PHP-ban automatikus típuskonverzió van, így az (unsigned big)int átalakul a PHP-ben float típussá, amiből mi semmit sem veszünk észre. A float típussal ügye csak pontosságot vesztettünk.

De mi van akkor, ha a PHP által adott választ egy szigorúbb nyelvvel akarjuk feldolgozni – vagy mert int-et várunk -, erőltetjük az int típust:

echo (int) ((int) PHP_INT_MAX+1); // -9223372036854775808

Akkor az bizony a PHP-ban is túlcsordul, ahogy azt a MySQL-ben is tenné ha signed bigint lenne és ebből mi semmit sem veszünk észre. Ugyanez, automatikus típuskonverzióval:
echo(PHP_INT_MAX+1); // 9.2233720368548E+18

Hogy ez miért okozhat gondot?

Elterjedt szokás, hogy biztonsági okok miatt lehetőleg csak ID-ket (azonosító számokat) küldünk szerver oldalra, mivel ezeket jóval könnyebb szűrni, mint a stringeket. Az adatbázisban pedig az azonosítók legtöbb esetben integer típusok, leginkább unsigned bigint-ek, autoincrement tulajdonsággal. Később pedig a szerver oldali vizsgálatnál – mivel számot várunk és az autotincrement alapból 1-ről indul – lustaságból ezt alkalmazzuk és úgy gondoljuk, hogy ezzel macera nélkül (prepared statements) meg is oldottuk az SQL injection elleni védelmet:


$id = abs($_GET['id']); // barmi nem szamra 0-t ad, ami az alap autoincerement 1-es kezdosorszama miatt nem letezo sorra mutat az adatbazisban
$results = $pdo->query('UPDATE users SET money=money+1000 WHERE id='.$id);

Ok, de eddig még sohasem okozott gondot a túlcsordulás, miért kellene rá figyelnem? 

Hát például ezért:
echo (int) PHP_INT_MAX; // 9223372036854775807
echo (int) ((PHP_INT_MAX+1000000)-1000000); // 9223372036854774784

Természetesen ez oda-vissza érvényes, azaz figyelni kell arra, hogy a PHP integer típusa több egész szám tárolására képes, mint a MySQL bizonyos integer típusai. A MySQL persze dob warningot, de ha külön nem kérdezzük meg róla, akkor jó eséllyel nem fogjuk észrevenni PHP-ben.

 

Sok forráskódban láttam már a fent említett lustaságból alkalmazott szám-konverziós védelmet. A baj az, hogy úgy hiszik elegendő csupán (int) -el erőltetni a típust. Csak hogy az negatív számokat is elfogad, így a túlcsordítással máris pozitív számmá változtathatjuk, ami viszont már tutira létezik az adatbázisban a tipikus autoincrementes megoldásoknál. Kiszámolni pedig könnyű a megfelelő mértékű túlcsordítást okozó számot, hogy a kért ID-t kapjuk eredményül. 

2015.07.19. 15:10 - legyes

Biztonsági mentés profi módon, ingyen: Comodo és EASEUS (ToDo) Backup

Régóta keresgélek olyan programokat, amik a teljes merevlemezt lementik, a számítógép újraindítása és varázslása nélkül.

Miért fontos ez? Mert az egyszerű felhasználó nem tud USB-ről bootolós Linux csodaprogramokkal bitről-bitre lementeni egy komplett rendszert.  Neki csak az kell, ha beüt a “ménkű”, akkor a lehető leghamarabb a működő operációs rendszerét kapja vissza az összes dokumentumával. De a mentés folyamata lehetőleg automatikus legyen, a program beszéljen magyarul, tudjon többféle helyre menteni, stb-stb…
Olvass tovább…

2010.10.11. 13:35 - legyes

Automatikus indítás tiltása a cserélhető meghajtókon

Automatikus indítás tiltása a cserélhető meghajtókon

Aki Windows XP-t használ, már biztosan találkozott azon állatira idegesítő újítással, hogy kikapcsolt autorun mellett is megjelenik a “mit akarok tenni a CD-vel” ablak. Tuti a legtöbb embert az őrületbe kergeti.

Ennek kikapcsolására 2 lehetőség van:

  • registry editorral
  • helyi házirendben (mmc-vel)

Registry editorral


1. START menü -> Futtatás -> regedit
2. HKEY_CURRENT_USER / Software / Microsoft / Windows / CurrentVersion / Policies / Explorer
3. NoDriveTypeAutoRun hexadecimális értékét állítsuk FF-re

screenshot

+1 idézet a hivatalos dokumentációból:

0x1 Disables Autoplay on drives of unknown type.
0x4 Disables Autoplay on removable drives.
0x8 Disables Autoplay on fixed drives.
0x10 Disables Autoplay on network drives.
0x20 Disables Autoplay on CD-ROM drives.
0x40 Disables Autoplay on RAM disks.
0x80 Disables Autoplay on drives of unknown type.
0xFF Disables Autoplay on all types of drives.

Ezek kombinációjához adjuk össze a hexa számokat.

mmc-vel

  1. START menü -> Futtatás -> mmc
  2. Fájl -> Beépül? modul hozzáadása/eltávolítása… -> Hozzáadás -> Csoportházirend (duplaklikk) -> Befejezés -> Bezárás -> OK
  3. Felhasználó konfigurációja / Felügyeleti sablonok / Rendszer / Automatikus lejátszás kikapcsolása (duplaklikk)
  4. Állítsuk Engedélyezve értékre
  5. OK-zások, a konzol beállításait nem szükséges menteni

screenshot

Forrás: Microsoft Windows 2000 Resource Kit (registry) és saját hosszas túrkálás (mmc)

2005.03.26. 22:23 - legyes

NTFS jogok, hiányzik a “Biztonság” fül Windows XP alatt

Windows XP

Az NTFS partíción korlátozhatjuk a hozzáférési jogokat, minden extra program vásárlása/telepítése nélkül. Ez nagyon jól jöhet, ha többen is használjuk a számítógépet. Viszont alapértelmezésben a Windows XP-ben el van rejtve a Biztonság fül, így nem tudjuk a megfelelő jogokat szabályozni. Az alábbiakban ennek elővarázsolását mutatom be.

1. Nyissuk meg a Sajátgép-et.
2. screenshot “Eszközök” -> “Mappa beállításai”
3. screenshot “Nézet” -> “Egyszerű fájlmegosztás használata” elől távolítsuk el a kijelölést
4. screenshot Szokásos OK-zás, majd kijelöljük a meghajtót vagy a könyvtárat. Jobb klikk -> “Tulajdonságok” -> “Biztonság” fül
5. screenshot Beállíthatjuk a jogokat. Figyelem! A “Mindenki” csoportba beletartozik a rendszergazda (rendszergazda jogú felhasználó) is!
+1 screenshot Felhasználót (amennyiben nem szerepel a listában), a “Hozzáadás” gomb megnyomása után, a “Speciális” gombra, majd a “Keresés most”-ra klikkelve adhatunk hozzá a felhasználó/csoport listáról. (Tartományban a “Helyek…” gombnál ki kell választani, hogy helyi vagy tartományi felhasználó/csoport listát kívánunk-e használni).
2005.03.25. 01:27 - legyes

Kikapcsolhatatlan tűzfal (Windows XP SP2-től)

Helyi hálózatban sok problémát okozhat a Windows XP (SP2) beépített tűzfala. Ha már voltunk egyszer tartományi tagok, azzal szembesülhetünk, hogy a tűzfal kikapcsolhatatlan, esetleg még Tartományi rendszergazdaként sem módosíthatunk semmit.

screenshot


Amennyiben már nem vagyunk tagjai a tartománynak(Windows 2003 SMB): Az alábbi módosítások esetében előfordulhat, hogy csak lokális rendszergazdaként tudjuk végrehajtani. (A bejelentkező képernyőn a helyi számítógépet kell választani)

1. screenshot

14.3 kByte

START menü -> Futtatás -> “mmc”
2. screenshot

49.5 kByte

Fájl menü -> Beépülő modul hozzáadása/eltávolítása
3. screenshot

30.2 kByte

[Hozzáadás]
4. screenshot

49.1 kByte

Csoportházirend kijelölése -> [Hozzáadás]
5. screenshot

117.2 kByte

A nekünk megfelelő opciókat értelemszerűen módosíthatjuk, de figyeljünk a megfogalmazásmódra, ugyanis a szövegek sokszor félreérthetőek. A Tartományi profil csak akkor lép életbe, ha tartományi felhasználóként vagyunk bejelentkezve, ellenkező esetben a Szokásos profil lép életbe.
6. Végül a szokásos mindenre OK művelet. Természetesen nem árt újraindítani a számítógépet.

Amennyiben tagjai vagyunk a tartománynak: Ebben az esetben a tartománykiszolgáló csoportházirendjében hajthatjuk végre a módosításokat az alábbiakban leírtak szerint.

1. screenshot

77 kByte

Ezt az okosságot közli velünk a Windows 2003 az XP SP2 tűzfalról
2. screenshot

101.7 kByte

A fentiekben leírt módon lépjünk a Csoportházirend szerkesztőbe
3. screenshot

165.1 kByte

A screenshot-on látható módon szerkeszthetjük a beállításokat (bármelyik beállításra jobb klikkelve szerkeszthető)
4. screenshot

125.7 kByte

A fentiekhez hasonló módon szerkeszthetjünk a tartományon belüli és a tartományon kívüli beállításokat, amelyet majd a tartományi csoportházirend fog érvényesíttetni a kliens számítógéppel a következő bejelentkezéstől kezdve.
2005.03.21. 16:34 - legyes