Autor Zpráva
Slapy
Profil
Dobrý deň,
mám kód:
CREATE TABLE `user` (
   `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
   `username` VARCHAR( 200 ) NOT NULL ,
   `password` VARCHAR( 200 ) NOT NULL ,
   `salt` VARCHAR( 200 ) NOT NULL,
   `mail` VARCHAR( 200 ) NOT NULL ,
   `web` VARCHAR( 200 ) NOT NULL ,
   `rand_chars` VARCHAR( 200 ) NOT NULL ,
   `sessionid` VARCHAR( 200 ) NOT NULL ,
   `prava` TINYINT NOT NULL ,
   `verified` TINYINT NOT NULL ,
   `stav` TINYINT NOT NULL ,
   `datum` DATETIME NOT NULL default '0000-00-00 00:00:00',
   `lastlogin` TIMESTAMP default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
    UNIQUE (`username` , `mail` )
) ENGINE = innodb CHARACTER SET utf8 COLLATE utf8_slovak_ci;

Pri registrácii sa spolieham že UNIQUE zabráni duplicitním username a mail ale ono to zabráni len v tom prípade že sa zhoduje username aj mail. Predtým než som zmenil hosting som tento problém nemal a všetko fungovalo správne môžte mi prosímvás pomôcť?
Joker
Profil
Slapy:
Řekl bych, že takhle zapsané UNIQUE omezení má dělat přesně to (tj. unikátní kombinace sloupců username a mail).
Docela se divím, že to na předchozím hostingu fungovalo.

Aby to dělalo že každý z těch sloupců má být unikátní, mělo by to tam (myslím) být napsané dvakrát Upřesnění: myšleno pro každý sloupec zvlášť. Anebo přímo u těch sloupců:
`username` VARCHAR( 200 ) NOT NULL UNIQUE,

Pár námětů mimo téma:
- PRIMARY KEY automaticky zahrnuje i NOT NULL, takže psát to ještě zvlášť je zbytečné (byť to nevadí, jen to je zbytečné)
- Session ID u uživatele? Co když bude přihlášený z více počítačů?
- Opravdu všechny řetězcové sloupce mají mít povolenou délku 200 znaků?
- U sloupce password (a možná i některých dalších) je šance, že hodnota bude řetězec vždy stejné délky (nějaký hash). Pak by se dal ušetřit 1 bajt na položku tím, že se místo VARCHAR nastaví CHAR(délka hashe)
Slapy
Profil
Joker:
Ďakujem. A ako inak by si ošetril prihlásenie sa na konto viac užívateľov? Ja to riešim tak že keď sa prihlási uložím do DB hodnotu jednej sessions ktorá sa vygeneruje s prihlásením užívateľa a pri každom pohybe na stránke ju porovnávam či je stále rovnaká ak nie tak užívateľa odhlási a výpiše sa mu hláška že sa na účet prihlásil niekto iný. Nevidím dvôvod aby užívateľ používal účet naraz na dvoch PC. K délce znakú áno áno ale pokiaľ mám neobmedzenú veľkosť DB prečo sa tým trápiť? To s tym hashom je dobrý nápad ale ako som už spomenul nie je dvôvod k šetreniu miesta.
Joker
Profil
Slapy:
To záleží o jaký typ stránky jde, třeba do nějaké administrace nebo tak se člověk přihlásí, něco udělá a zas se odhlásí.
Ale u něčeho jako třeba tahle diskuse bývá dost lidí přihlášených vlastně pořád a klidně z více míst- mají počítač doma, ve škole/práci a třeba ještě notebook/netbook/mobil a neodhlašují se (buď počítač jen uspávají, nebo využívají obnovení naposledy otevřených stránek v prohlížeči).
Pak by mě asi štvalo, kdybych se na stránku díval každý den ze dvou počítačů a vždycky by mi to nejdřív napsalo „Byl jste odhlášen“, protože jsem tam mezitím byl z toho druhého.

pokiaľ mám neobmedzenú veľkosť DB prečo sa tým trápiť?
S délkou VARCHARů nejde ani tak o velikost, ostatně VARCHAR zabírá místo podle řetězce uloženého uvnitř, ne podle maximální délky.
Jde spíš o logické omezení vyplývající z požadavků aplikace.
Například počítá aplikace s tím, že uživatel bude mít 200-znakové jméno?
12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
Pokud ne, mělo by tam být reálné omezení podle požadavků aplikace.
Slapy
Profil
Joker:
No toto nastavujem v PHP takže nevidím dôvod prečo vkladať do každého riadku iný varchar keď mi stačí napísať prvý riadok nakopírovať ho x krát a potom už len upraviť názvy stĺpcov pre mňa je to v podstate práca na vyše keďže by som aj tak v php musel nakódiť že ak je meno dlkšie ako chcem aby napísalo že je meno dlkšie ako chcem. Určite by sa to dalo spraviť využitím MySQL ale keď už to raz mám zariadené inak načo to meniť pokiaľ to nieje nevyhnutné?

E: Ale čo ak sa na vaše konto prihlási niekto iný? Ani sa o tom neodzviete. Tá pripomienka s odhlasovaním je dobrá. Mňa to nenapadlo pretože na osobných PC používam ukladanie hesiel ale určite to upravím tak aby som vyhovel aj užívateľom tvojho typu.
pcmanik
Profil
Slapy:
To si ako lenivy zmenit par ciseliek? A co nastavujes v php? Zrejme maximalnu moznu dlzku retazcov, tak tu by si mal pouzit aj v databaze.
Cize ak chapem tvoj text. "ze by si musel nakodit ak je meno dlhsie, aby to vypisalo, ze je dlhsie ako chces" Tak mi z toho vyplyva, ze u teba sa kludne moze uzivatel s tymi 200 znakmi zaregistrovat? A ak by nahodou napisal 201 znakov, tak ten dalsi znak sa mu v DB oreze a ty ho o tom nebudes informovat?
Slapy
Profil
pcmanik:
Nie to som to asi napísal zle. Myslím tým že v php mám viriešené koľko znakov môže mať užívateľské meno a ak hranicu prekročí informujem ho že prekročilo hranicu a aby si zvolil iné. Ale aký zmysel má upravovať podľa toho varchar keď už to raz mám nastavené v php?

E: ešte že "lenivosť je základ každého dobrého programátora" a nepítajte sa ma že kde som to počul :-)
Slapy
Profil
Joker:
Hmm jediné riešenie ktoré ma aktuálne napadá je normálnych užívateľov z tejto kontroli vyhodiť a nechať tam len užívateľov ktorých odcudzenie účtu by moholo poškodiť chod stránky. A ako náhradu opatrenia normálnemu uživateľovy zaznamenávať IP s ktorých bol na účet prihlásení a umožniť mu pozreť si tieto IP. Netuším či je to dostatočné opatrenie ale útočník zrejme nebude mať veľa dvôvodov kvôli ktorím by sa mu oplatilo trápiť sa s prelomením ochrany aby sa dostal k bežnému účtu.
Joker
Profil
Slapy:
nevidím dôvod prečo vkladať do každého riadku iný varchar
No já nevidím důvod dávat všude stejný.

v php mám viriešené koľko znakov môže mať užívateľské meno
Ale to není otázka PHP nebo databáze, to omezení by se mělo respektovat všude.
Stejnětak třeba Javascriptová validace na klientovi neznamená, že nebude validace i na serveru.

A když je to „vyřešené v PHP“, opravdu to je „vyřešené“ všude? Nebo je někde na jednom místě v kódu zahrabaná nějaká validace kterou při troše smůly půjde obejít anebo za půl roku dokódujete nějaký nový způsob registrace a zapomenete tam tu validaci přidat?
Ono vzato do důsledků, pokud databáze má limit 200 znaků a aplikace nějaký menší, mělo by PHP i při každém čtení z databáze kontrolovat, jestli načtená položka není moc dlouhá.

Samozřejmě v tomhle případě svým způsobem už řešíme blbosti, ale jde mi o to ukázat princip: Aplikace by měla být pokud možno robustní, takže ignorovat mechanismus omezující chyby (který navíc vůbec nic nestojí) s tím, že ta kontrola se už na jednom místě dělá, není ideální přístup.
Zjednodušeně, lepší přístup je: „Moc dlouhé jméno vyhodí Javascriptovou hlášku, kdyby to nezabralo hlášku v PHP a kdyby ani to nezafungovalo, ořízne se to v databázi“, než „Na jedno místo dám kontrolu a všude jinde budu spoléhat na to, že to přes ni projde“.

ad krádež účtu:
Tam jsou různé metody jak tomu předcházet, přijde mi, že spojovat tuhle kontrolu s krádeží účtu by generovalo spíš falešné poplachy, když se uživatel mezitím přihlásí odjinud, vyprší mu cookie a podobně.

Ale to už jsme opravdu odbočili, původní problém je tedy vyřešen?
Slapy
Profil
Joker:
Áno problém je vyriešení ďakujem za diskusiu.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0