Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: System kont w php
Forum PHP.pl > Forum > PHP
phpkoder
Wiem, że najprzystępniejszą drogą tworzenia kont jest oparcie ich o bazę danych, ale czy są inne drogi. Zalożmy, że strona będzie obslugiwać 10 użytkowników dalo by się to sensownie zrobić poprzez np. plik questionmark.gif
Tomplus
Oczywiście. Przykładowo
user:hash:group
Kod
phpkoder:$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a:admin,user
tomplus:$2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K:user


Oczywiście musisz zablokować dostęp do tego pliku aby przypadkiem nikt nie otworzył go jako plik tekstowy.
Ale takie zastosowanie jest np. w DokuWiki, wiki bez obsługi zewnętrznych baz danych.
viking
Zawsze możesz sqlite. Jest to 1000x lepsze niż taka płaska baza w txt.
markonix
Tablica w PHP, sprawdza się przy micro aplikacjach. Przynajmniej nie martwisz się o SQL injection biggrin.gif
Pyton_000
@viking nie przesadzajmy wink.gif Dla 10 linijek?
viking
Z plikami jest fajnie dopóki się nie pomyli i sobie czegoś nie nadpisze przez równoległe operacje. Wtedy cały plik najczęściej do kosza. A sqlite to też jeden plik i zazwyczaj jest na każdym serwerze.
Puszy
Cytat(viking @ 1.07.2017, 15:18:53 ) *
Z plikami jest fajnie dopóki się nie pomyli i sobie czegoś nie nadpisze przez równoległe operacje. Wtedy cały plik najczęściej do kosza. A sqlite to też jeden plik i zazwyczaj jest na każdym serwerze.


Moim zdaniem do tego wystarczy dobrze obsłużony flock()
phpkoder
Dziekuję za odpowiedzi.

Stworzyłem system kont w oparciu o plik, wykorzystałem szyfrowanie AES zamiast hash-owania do ukrycia kluczy użytkowników. Teraz jest problem jak ukryć klucz AES. Umieścić w kodzie w jakiś wymyślny sposób, czy zostawić to jak niżej i będzie dobrze, bo rzecz jasna jak ktoś przejmie plik z kodem php to i tak odczyta klucz.
  1. private $aesCrypte; //klasa szyfrująca
  2. private $aesPasswordToAccMgr;
  3.  
  4. public function __construct() {
  5. $this->aesPasswordToAccMgr = "01yw3z6289abqdef%1z31";
  6. $this->aesCrypte = new AesCrypte();
  7. }

user:encrypted_password:privileges

Plik z kontami wygląda tak:
aa:eAMHtDIxZtVjoAUDO4YlC8uu0QAQyPxRvP542hkbSJk=:user

Stworzyłem również system sesji oparty o plik.
user:ID_SESJI

aa:2DI,A4-ON52:-INC/;B6,NF8O)KZR+2:GAAI0?=XZ;>1WLS@40QCPRHPOVZ:*DV?5?KH2U=MLT3BXUV+O*PM1=YL-H9

Ogólnie celem aplikacji jest stworzenie bezpiecznej skrzynki na pliki mają być spełnione następujące funkcjonalności:
- tworzenie kont
- logowanie z sesja (własny mechanizm bez wykorzystania cookies)
- wysyłanie plików do swojego folderu
- wysyłanie plików do folderu innego użytkownika
- dobra walidacja i mechanizmy zabezpieczające

A jeśli chodzi o operacje równoległe w php to jak mam to rozumieć jak dwie osoby w tym samym momencie załóżmy będą tworzyć konto i w tym samym momencie dotrze żądanie do serwera to dojdzie do konfliktu questionmark.gif?
Tomplus
Przykład z manuala
  1. <?php
  2. $file = 'people.txt';
  3. // Nowa osoba dodawana do pliku
  4. $person = "John Smith\n";
  5. // Zawartość $person zapisywana do pliku $file
  6. // używając flagę FILE_APPEND zawartość dołącza na końcu pliku
  7. // używając flagę LOCK_EX uniemożliwiamy zapis do pliku w tym samym czasie.
  8. file_put_contents($file, $person, FILE_APPEND | LOCK_EX);
  9. ?>


Ogólnie rzecz mówiąc, zapis wtedy zakolejkuje się.
Pyton_000
Tak, ale tutaj trzeba by było zrobić lock na odczyt tak na prawdę, bo sytuacja:
- dwoje userów odczytuje zawartość pliku
- oboje robią zmiany.
- Najpierw zapisuje drugi user
- potem nadpisuje całość pierwszy user.

tak więc to też trzeba zabezpieczyć.
Sensownym wyjściem jest odczyt wartości dla usera, usunięcie starego wpisu, a potem dodanie na koniec nowego wpisu. W ten sposób zabezpieczysz się przed taką sytuacją.

No chyba że tak na prawdę to nie będzie miało miejsca ale sytuacje różne trzeba przemyśleć i przewidzieć reakcje.
Puszy
Cytat(Pyton_000 @ 3.07.2017, 17:52:37 ) *
Tak, ale tutaj trzeba by było zrobić lock na odczyt tak na prawdę, bo sytuacja:
- dwoje userów odczytuje zawartość pliku
- oboje robią zmiany.
- Najpierw zapisuje drugi user
- potem nadpisuje całość pierwszy user.

tak więc to też trzeba zabezpieczyć.
Sensownym wyjściem jest odczyt wartości dla usera, usunięcie starego wpisu, a potem dodanie na koniec nowego wpisu. W ten sposób zabezpieczysz się przed taką sytuacją.

No chyba że tak na prawdę to nie będzie miało miejsca ale sytuacje różne trzeba przemyśleć i przewidzieć reakcje.

Można by też zamiast edycji dodawać kolejne linie. W momencie autoryzacji pobierany byłby najświeższy wpis z aktualnym hasłem. Do tego CRON który czyści stare wpisy dla tego samego użytkownika
Pyton_000
Można i tak. To też jest jakieś wyjście.

W sumie takie kombinowanie zamiast użycie sqlite biggrin.gif
Tomplus
Jak dla mnie zawsze uderza mnie kwestia jak duża pula użytkowników będzie.
Jeżeli jest to pula mała <100 to szansa że rejestracja będzie dwóch użytkowników w TEJ SAMEJ SEKUNDZIE jest abstrakcyjnie mała.

Pyton_000
Szanse wygrania w totka też są małe biggrin.gif a ludzie wygrywają haha.gif
Puszy
Cytat(Tomplus @ 3.07.2017, 19:14:20 ) *
Jak dla mnie zawsze uderza mnie kwestia jak duża pula użytkowników będzie.
Jeżeli jest to pula mała <100 to szansa że rejestracja będzie dwóch użytkowników w TEJ SAMEJ SEKUNDZIE jest abstrakcyjnie mała.


Nadal tu nie widzę problemu, choć faktycznie szansa jest niemal zerowa. Jeżeli file_put_contents samo się ładnie nie zakolejkuje to wystarczy zrobić override tej funkcji ze sprawdzeniem czy jest lock, jeżeli jest to ponowić próbę po 0.25 sekundy. Sama akcja na pliku zajmuje mikrosekundy, nawet przy pliku w tym formacie zawierającym 2k użytkowników.
phpkoder
  1. $fp = fopen($path, "ra");
  2. if (flock($fp, LOCK_EX)) {
  3. //operacje na pliku
  4. flock($fp, LOCK_UN);
  5. }
  6. fclose($fp);


Pozakladalem locki na funkcje. Plik sesji i z kontami nie powinien wybuchnąć.

Aktualnie zastanawiam się jakie prawa dostępu nadać do pliku:
- folder z plikiem sesji i kontami (0600) questionmark.gif
- z kontami (0600) questionmark.gif
- do pliku sesji (0600) questionmark.gif
- do folderu z użytkownikami (0777) questionmark.gif
- do folderu użytkownika slużącego do skladowania swoich plików (questionmark.gifquestionmark.gif)
- do folderu użytkownika na pliki wyslane przez innych użytkowników (questionmark.gifquestionmark.gif)

Nie tak prosto mądrze poustawiać te parametry.

Struktura folderów jest następująca.

accountFolder:
- session.txt
- accounts.txt
users:
- marek_myFile:
* pliki
....
- marek_fileFromUsers
* plikiWyslanePrzezInnychUzykownikow
....

Trzeba się zabezpieczyć na każdą ewentualność chcę profesjonalnie napisać ten program http://forum.php.pl/style_images/upgrade_i...cons/icon10.gif
viking
Te ustawienia miały by sens dla konta systemowego systemu operacyjnego. Dla webu i tak wszystko przechodzi przez serwer i musi na jego prawach pracować.
phpkoder
A ok czyli ustawić 0777 i liczyć na to, że serwer ma zabezpieczenia nie do przejścia.

To w takim razie jeszcze jedno pytanie. Jak zablokować plik przed pobraniem smile.gif, żeby nie bylo, że podam ścieżkę http://myWWW/accounts/account.txt i pobiorę sobie plik z kontami, albo plik z kluczami sesji.

Najlepiej, żeby serwer po prostu milczal na próbę wpisania takiego URI.

nospor
Dajac 0777 na wszystko dajesz wszystkim do tego dostep.
Daj tylko dla serwera www

Zas co do drugiego pytania to pliki te maja lezec poza publicznym folderem www i nikt z www sie do nich nie dobierze.
Puszy
Co do praw na folder, możesz dać dowolne, ważne żeby plik nie był wystawiony na zewnątrz.

project
|
-- data
| |
| -- plik-z-uzytkownikami
-- public
| |
| -- index.html

gdzie /project/public jest podpięty do domeny
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.