-
1. Data: 2013-10-29 10:48:44
Temat: Bezpieczeństwo komunikacji Ajax
Od: Marek <p...@s...com>
Witam,
Chciałbym Was podpytać jak bezpiecznie zrealizować następujące zadanie.
Otóż mamy sobie tabelkę z rekordami z bazy danych.Powiedzmy imię,
nazwisko itd plus jeden checkbox. Zmiana stanu tego checkboxa ma
powodować zmianę w rekordzie użytkownika. Pomyślałem sobie, że zrobię to
tak:
<input type="checkbox" onChange="update(ID_usera, wartosc)"...
Funkcja update zawiera kod Ajax'a i wykonuje asynchroniczną komunikację
z serwerem. Wszystko fajnie, ale teraz wyobraźmy sobie sytuację, w
której ktoś ma przeglądarkę z obsługą JS w trybie konsoli i może tam
wszystko z palca wpisać. Nie ma ta osoba dostępu do podstrony WWW (bo
np. wymagane są do tego jakieś uprawnienia). No i wpisuje sobie
update(100,5) i aktualizuje się setny użytkownik...
Jak weryfikować czy żądanie pochodzi w właściwej (pod)strony i może
zostać obsłużone?
--
Pozdrawiam
Marek
-
2. Data: 2013-10-29 11:09:15
Temat: Re: Bezpieczeństwo komunikacji Ajax
Od: Marek <p...@s...com>
P.S.
Chodzi mi o to, że w przypadku zwykłego formularza, możemy pozostać na
danym URLu i tylko dany URL (skrypt PHP) będzie umiał obsłużyć formularz
z tej strony. Jeśli użytkownik nie posiada uprawnień do bycia na tejże
stronie, to nie dostanie się tym samym do tego formularza i nie będzie
miał szans namieszać. Daje to jakiś poziom wiarygodności (a już w
szczególności gdy posłużymy się ukrytym polem ID transakcji zmienianym
po każdym przeładowaniu formularza).
Tymczasem funkcja JS może być wywołana na każdej podstronie serwisu więc
tak jakby "wirtualny formularz" był wszędzie opublikowany i potrafił być
na każdej stronie obsłużony więc każdy użytkownik bez żadnych uprawnień
może zmienić rekord w bazie będąc np. na stronie głównej serwisu.
--
Pozdrawiam
Marek
-
3. Data: 2013-10-29 13:26:17
Temat: Re: Bezpieczeństwo komunikacji Ajax
Od: "Neevor@W" <p...@n...ru>
Marek wrote:
> Funkcja update zawiera kod Ajax'a i wykonuje asynchroniczną komunikację
> z serwerem. Wszystko fajnie, ale teraz wyobraźmy sobie sytuację, w
> której ktoś ma przeglądarkę z obsługą JS w trybie konsoli i może tam
> wszystko z palca wpisać. Nie ma ta osoba dostępu do podstrony WWW (bo
> np. wymagane są do tego jakieś uprawnienia). No i wpisuje sobie
> update(100,5) i aktualizuje się setny użytkownik...
>
Umieścić skrypt wyłącznie na tej jednej podstronie ;)
Generalnie na końcu obsługi zdarzenia uruchamiasz jakiegoś POSTa.
Ten POST idzie na konkretny URL.
Po stronie serwera sprawdzasz, czy aktualny użytkownik ma prawo wywołać
tego URLa. Jeśli może, kontynuujesz... Jeśli nie, 404, 401, 503 czy co
ci tam do głowy przyjdzie.
--
GCA/ED d s+:++ a C++ ULA P+++ L+ E--- W+++ N+++ o+ K- w+++ O+ M+ V-
PS PE++ Y-- PGP- t-- 5-- X+ !tv R b+ DI-- D+ G e++ h--- r+++ z+++*
-
4. Data: 2013-10-29 13:45:32
Temat: Re: Bezpieczeństwo komunikacji Ajax
Od: Marek <p...@s...com>
W dniu 2013-10-29 13:26, Neevor@W pisze:
>
> Generalnie na końcu obsługi zdarzenia uruchamiasz jakiegoś POSTa.
> Ten POST idzie na konkretny URL.
> Po stronie serwera sprawdzasz, czy aktualny użytkownik ma prawo wywołać
> tego URLa. Jeśli może, kontynuujesz... Jeśli nie, 404, 401, 503 czy co
> ci tam do głowy przyjdzie.
Ok, to łapię. Jednakże może się zdarzyć, że użytkownik ma prawo do URL'a
wysłanego z Ajaxa ale przebywa na URLu, spod którego wspomniane
wywołanie Ajaxowe nie ma sensu. Przykładowo jesteśmy w edytorze listy
klientów gdzie możemy wykasować któregoś z nich. Klikamy "kasuj" obok
nazwiska, wołamy skasuj(ID_klienta), Ajax wykonuje akcję, użytkownik znika.
Teraz sytuacja "patologiczna", przed którą chciałbym się uchronić.
Użytkownik jest zalogowany, ma prawo do kasowania klientów i nie jest w
edytorze użytkowników lecz np. na stronie głównej serwisu. W jakiś
sposób wywołuje z konsoli skasuj(234). Co z tym zrobić? Pozwolić na
skasowanie klienta 234? Niby wolno to zrobić ale nie z tego miejsca.
Funkcja skasuj() nie wie skąd może być wywoływana więc sama siebie nie
może zweryfikować. Z kolei po stronie PHP też nie mam jak tego sprawdzić
(chyba) z uwagi na to, że wywołania Ajax'a nie są związane z żadnym
URLem. A może nie przejmować się tym wcale i pozwalać na takie operacje?
--
Pozdrawiam
Marek
-
5. Data: 2013-10-30 02:03:00
Temat: Re: Bezpieczeństwo komunikacji Ajax
Od: Exe Very Cute <k...@p...onIet.pl>
W dniu 2013-10-29 13:45, Marek pisze:
> Teraz sytuacja "patologiczna", przed którą chciałbym się uchronić.
> Użytkownik jest zalogowany, ma prawo do kasowania klientów i nie jest w
> edytorze użytkowników lecz np. na stronie głównej serwisu.
A co za różnica czy zrobi to z GUI czy z palca? Efekt ten sam.
Pozdr
Exe Very Cute
-
6. Data: 2013-10-30 08:03:38
Temat: Re: Bezpieczeństwo komunikacji Ajax
Od: "Neevor@W" <p...@n...ru>
Marek wrote:
> jest [...] na stronie głównej serwisu. [...] wywołuje z konsoli skasuj(234)
>
Po prostu nie udostępniasz funkcji skasuj na stronie głównej.
Dzielisz skrypty funkcjonalnie na wszystkie podstrony.
Dodatkowo wydzielasz grupę która jest dostępna wszędzie i ładujesz
zależnie od kontekstu te JSy które są aktualnie potrzebne.
Podobnie mozesz zrobić z CSSami czy szablonami dla $.tmpl.
Tak to mniej więcej wygląda u mnie (po stronie serwera):
w zmiennej $content jest aktualnie wyświetlona podstrona
public function __construct($content = "", $data = null) {
parent::__construct();
if ($content !=='') {
$this->loadContentTemplate($content);
$this->addScripts('/saleconfig/js/colResizable-1.3.s
ource.js');
$this->addScripts('/saleconfig/chosen/chosen.jquery.
min.js');
$this->addScripts('/saleconfig/chosen/jquery.uniform
.js');
$this->addCSS('/saleconfig/new_styles.css');
$this->addCSS('/saleconfig/chosen/chosen.css');
$this->addScripts('/js/compareClass.js');
}
if($content === 'mainMenu') {
$this->addCSS('/css/mainMenu.css');
$this->addScripts('/js/mainMenu.js');
$this->render();
}else{
switch($content){
case 'testPage':
$this->addScripts('/js/test.js');
$this->addCSS('/css/test.css');
$tmpls= new
Template(SiteConfig::getInstance()->templatesRoot().
'/testtmpls.html');
$this->mainTemplate->replaceVariable('<!--[jslike_te
mplates]-->',
$tmpls->source);
break;
case 'customers':
$this->addScripts('/saleconfig/customers.js');
$this->addScripts('/saleconfig/customersList.js');
$this->addScripts('/js/formValidation.js');
$this->addScripts('/js/displayList.js');
$jsLike = new
Template(SiteConfig::getInstance()->templatesRoot().
'/jstmpls.html');
$this->mainTemplate->replaceVariable('<!--[jslike_te
mplates]-->',
$jsLike->source);
break;
case 'assorts':
$this->addCSS('/saleconfig/assortsList.css');
$this->addCSS('/saleconfig/pricesCharts.css');
$this->addCSS('/saleconfig/css/uniform.css');
$this->addScripts('/js/compareClass.js');
$this->addScripts('/lib/paperjs/paper.js');
$this->addScripts('/js/pricesCharts.js');
$this->addScripts('/saleconfig/assorts.js');
$this->addScripts('/saleconfig/assortsList.js');
$this->addScripts('/js/uomValidation.js');
$this->addScripts('/js/formValidation.js');
$templates = new
i tak dalej...
--
GCA/ED d s+:++ a C++ ULA P+++ L+ E--- W+++ N+++ o+ K- w+++ O+ M+ V-
PS PE++ Y-- PGP- t-- 5-- X+ !tv R b+ DI-- D+ G e++ h--- r+++ z+++*
-
7. Data: 2013-10-30 21:40:18
Temat: Re: Bezpieczeństwo komunikacji Ajax
Od: Marek <p...@s...com>
W dniu 2013-10-30 02:03, Exe Very Cute pisze:
> A co za różnica czy zrobi to z GUI czy z palca? Efekt ten sam.
Właśnie tak zacząłem kombinować, że nie ma czym się przejmować.
--
Pozdrawiam
Marek
-
8. Data: 2013-10-30 21:44:18
Temat: Re: Bezpieczeństwo komunikacji Ajax
Od: Marek <p...@s...com>
W dniu 2013-10-30 08:03, Neevor@W pisze:
>>
> Po prostu nie udostępniasz funkcji skasuj na stronie głównej.
> Dzielisz skrypty funkcjonalnie na wszystkie podstrony.
Hmm... jest to jakieś rozwiązanie. Choć z drugiej strony przy portalach
często używanych generuje to mnóstwo żądań HTTP.
Przemyślę tą koncepcję choć Exe słusznie zwrócił uwagę, że jeśli user ma
uprawnienia do operacji, to jeśli będzie miał fantazję ułańską wykonać
operację z poziomu konsoli, to niech sobie ją robi.
--
Pozdrawiam
Marek