Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> System kont w php
phpkoder
post
Post #1





Grupa: Zarejestrowani
Postów: 8
Pomógł: 1
Dołączył: 1.07.2017

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 19)
Tomplus
post
Post #2





Grupa: Zarejestrowani
Postów: 1 879
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
viking
post
Post #3





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Zawsze możesz sqlite. Jest to 1000x lepsze niż taka płaska baza w txt.


--------------------
Go to the top of the page
+Quote Post
markonix
post
Post #4





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


Tablica w PHP, sprawdza się przy micro aplikacjach. Przynajmniej nie martwisz się o SQL injection biggrin.gif


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post
Post #5





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


@viking nie przesadzajmy wink.gif Dla 10 linijek?
Go to the top of the page
+Quote Post
viking
post
Post #6





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
Puszy
post
Post #7





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

Ostrzeżenie: (0%)
-----


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()
Go to the top of the page
+Quote Post
phpkoder
post
Post #8





Grupa: Zarejestrowani
Postów: 8
Pomógł: 1
Dołączył: 1.07.2017

Ostrzeżenie: (0%)
-----


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?

Ten post edytował phpkoder 3.07.2017, 10:42:35
Go to the top of the page
+Quote Post
Tomplus
post
Post #9





Grupa: Zarejestrowani
Postów: 1 879
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


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ę.
Go to the top of the page
+Quote Post
Pyton_000
post
Post #10





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Puszy
post
Post #11





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Pyton_000
post
Post #12





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Można i tak. To też jest jakieś wyjście.

W sumie takie kombinowanie zamiast użycie sqlite biggrin.gif
Go to the top of the page
+Quote Post
Tomplus
post
Post #13





Grupa: Zarejestrowani
Postów: 1 879
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


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.

Go to the top of the page
+Quote Post
Pyton_000
post
Post #14





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Szanse wygrania w totka też są małe biggrin.gif a ludzie wygrywają haha.gif
Go to the top of the page
+Quote Post
Puszy
post
Post #15





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
phpkoder
post
Post #16





Grupa: Zarejestrowani
Postów: 8
Pomógł: 1
Dołączył: 1.07.2017

Ostrzeżenie: (0%)
-----


  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

Ten post edytował phpkoder 13.07.2017, 11:13:54
Go to the top of the page
+Quote Post
viking
post
Post #17





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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ć.


--------------------
Go to the top of the page
+Quote Post
phpkoder
post
Post #18





Grupa: Zarejestrowani
Postów: 8
Pomógł: 1
Dołączył: 1.07.2017

Ostrzeżenie: (0%)
-----


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.

Go to the top of the page
+Quote Post
nospor
post
Post #19





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Puszy
post
Post #20





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 10:34