PHP skript - funkcny na localhoste, nefunkcny na serveri

Programovacie jazyky, rady, poradňa...
Holubar
Darca
Darca
Používateľov profilový obrázok
Príspevky: 3894
Registrovaný: 24 feb 2005, 21:26
Bydlisko: Senec
Kontaktovať používateľa:

PHP skript - funkcny na localhoste, nefunkcny na serveri

Príspevok od používateľa Holubar »

Dnes som dokoncoval sekciu pre registraciu uzivatelov, uzivatelske profily a pod a pri skripte na upravu osobnych udajov som narazil na problem, s ktorym si neviem rady. Skript na localhoste funguje bez problemov, no na serveri skonci hned pri prvej podmienke, ktoru by mal za normalnych okolnosti preskocit, co sa na localhoste aj udeje.

Toto je zaciatocna cast toho skriptu. Skript pochadza z knihy o php od wrox

Kód: Vybrať všetko

  // Kontrola, zda uživatelské jméno souhlasí s identifikátorem uživatele
  // (aby hackeři nemohli manipulovat s údaji jiných uživatelů).
  $query = 'SELECT nick FROM uzivatel WHERE user_id = ' . (int)$user_id .
    ' AND nick = "' . mysql_real_escape_string($_SESSION['nick'], $db) .
    '"';
  $result = mysql_query($query, $db) or die(mysql_error());

  if (mysql_num_rows($result) == 0) { 
    ?>

        <p><strong>Nemáte oprávnenie pre zmenu údajov!</strong></p>

    <?php
    mysql_free_result($result);
    mysql_close_db($db);
	include 'include/zaobend.php';
    die();
  }
  mysql_free_result($result);
A toto je chyba, ktoru dostavam na serveri websupportu:
Fatal error: Call to undefined function: mysql_close_db() in /data/h/o/holubar.sk/web/uzivatelsky-system/uprava_osobnych_udajov.php on line 41

Ked som na localhoste dostaval spravy o tom, ze php nerozozna funkcie mysql, tak som mal chybu bud v konfiguracii php.ini resp apache. Uz som pisal aj mail na helpdesk, no rad by som sa spytal aj tu.

A ked uz som tu uviedol tu cast skriptu, hned sa aj spytam na jej vyznam. Ten mi totizto nie je jasny. Ako moze hacker manipulovat s cudzim uctom, ked pre kazde konto je user_id aj username odovzdavane bud cez POST, alebo cez SESSION. Ten test v podstate len porovnava user_id, ktore je tahane z db a nick, ktory bol odovzdany do $_SESSION bud po prihlaseni alebo registracii. Tak aky by mohol byt mechanizmus, aby to nesedelo a niekto sa tak dostal k cudziemu kontu?

A dalsia otazka je na to (int) v tejto casti kodu:

Kód: Vybrať všetko

 $query = 'SELECT nick FROM uzivatel WHERE user_id = ' . (int)$user_id .
Neozumiem, co to je, co to robi a preco. Budem vdacny za pomoc

//autoeditácia príspevku (26 Feb 2010, 0:05)
Tak po chvili patrania som zistil, ze v knihe spravili chybu a ta funkcia ma byt spravne mysql_close bez _db, no ale stale nerozumiem, preco na serveri vyhodnoti tento test ako true, ked na localhoste je false a preskoci ho.

No aj tak by som bol vdacny za objasnenie tych dalsich otazok

//autoeditácia príspevku (26 Feb 2010, 0:57)
Ten skript nefungoval ani po opraveni tej chyby a po jeho spusteni sa zmazal cely obsak premennych $_POST a $_SESSION, tak som pozrel do nastaveni php a vypol som na serveri register_globals. Po tejto zmene skript funguje aj na serveri tak ako ma. Vie mi niekto objasnit aj tuto zahadu?
Mek
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4661
Registrovaný: 23 mar 2005, 23:00
Bydlisko: ZA <-> TN
Kontaktovať používateľa:

Re: PHP skript - funkcny na localhoste, nefunkcny na serveri

Príspevok od používateľa Mek »

register_globals ti prepise lokalne premenne ich ekvivalentmi zo superglobalnych poli GET, POST a COOKIE. Staci svoje lokalne premenne pomenovavat inac nez tie v menovanych poliach a problemu sa da vyhnut.
Holubar
Darca
Darca
Používateľov profilový obrázok
Príspevky: 3894
Registrovaný: 24 feb 2005, 21:26
Bydlisko: Senec
Kontaktovať používateľa:

Re: PHP skript - funkcny na localhoste, nefunkcny na serveri

Príspevok od používateľa Holubar »

tak to uz potom rozumiem, preco. V tych skriptoch, ktore pouzivam su nazvy lokalnych premennych a ich klucov v globalnych rovnake, je s tym tak jednoduchsia praca a menej ma to matie.
Cudujem sa, ze websupport to nechava defaultne zapnute aj ked nove php balicky to uz autmaticky vypinaju kvoli bezpecnostnym problemom
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: PHP skript - funkcny na localhoste, nefunkcny na serveri

Príspevok od používateľa audiotrack »

môžeš si to skúsiť sám vypnúť cez ini_set() alebo použitím .htaccess
Holubar
Darca
Darca
Používateľov profilový obrázok
Príspevky: 3894
Registrovaný: 24 feb 2005, 21:26
Bydlisko: Senec
Kontaktovať používateľa:

Re: PHP skript - funkcny na localhoste, nefunkcny na serveri

Príspevok od používateľa Holubar »

da sa to vypnut cez webadmina tak uz je to v poriadku. Vedel by si mi napisat nieco k tym otazkam v prvom poste?
Mek
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4661
Registrovaný: 23 mar 2005, 23:00
Bydlisko: ZA <-> TN
Kontaktovať používateľa:

Re: PHP skript - funkcny na localhoste, nefunkcny na serveri

Príspevok od používateľa Mek »

To (int) je konverzia na int, teda cislo, ktora zlyha, ak sa tam dostane neciselny vstup.
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Re: PHP skript - funkcny na localhoste, nefunkcny na serveri

Príspevok od používateľa chrono »

Presne tak. Konverzia na int sa používa vtedy, ak je to v DB uložené ako číslo. V takom prípade nemusíš tú hodnotu "escapeovať" (ak ten reťazec obsahuje niečo iné ako číslo, tak je výsledok tej konverzie 0).
Napísať odpoveď