2012-12-02 6 views
21

Po prostu zaczyna się grać z breeze.js ze względu na oczywiste korzyści w czasie kodowania, tj. Zarządzanie dostępem do danych modelu z serwera bezpośrednio w JavaScript (jestem tutaj początkującym, tak oczywistym!).Czy nie jest niebezpieczne posiadanie informacji o zapytaniach w javascript za pomocą breezejs?

W przeszłości korzystałem z wywołań ajaxowych w celu uzyskania/wysłania danych na serwer, a w przeszłości korzystałem z kilku różnych narzędzi klienckich, aby zapewnić pomoc w wyszukiwaniu lokalnych danych, takich jak jLinq.

Moje pytanie jest takie. Czy w języku JavaScript nie jest niebezpieczne posiadanie w zasadzie pełnego dostępu do kwerendy modelu? Muszę czegoś przegapić, ponieważ wygląda na naprawdę dobrze przemyślane narzędzie. W przeszłości przynajmniej kontrolowałem, co można wysłać do klienta za pośrednictwem procesu zapytania backendu, i znowu używając czegoś takiego jak jLinq itd. Mogłem filtrować dane itp. Mogę też zrozumieć kompromis, być może z uzyskaniem bezpośredniego zapytania/brak powielania problemu z lokalnym modelem, więc czy ktoś mógłby w tym pomóc?

Dzięki!

EDIT Oczywiście nie jestem jedyną osobą, jednak jestem zgadywania istnieje uzasadnione odpowiedzi - być może ograniczając dane są wymagane przy zastosowaniu metod Dto czy coś? The other question posted is here

+0

Niebezpieczny w jaki sposób? Czy twój model zawiera poufne dane, które nie powinny być wystawione na klienta? – David

Odpowiedz

14

Przedstawienie pełnego modelu biznesowego może być niebezpieczne. Niebezpieczne może być zezwolenie na nieograniczoną kwerendę nawet tej części modelu, która ma zostać udostępniona klientowi. Jest to prawdą, niezależnie od tego, czy oferujesz łatwy w zapytaniu interfejs API, czy taki, który jest trudny do wyszukania.

Dlatego nasze zespoły zwracają uwagę na to, jak budujemy nasze usługi.

Należy ujawniać typy, których potrzebuje aplikacja kliencka. Jeśli chcesz ograniczyć dostęp do autoryzowanych instancji danego typu, możesz napisać dokładnie zalecane metody serwisowania, których nie można przypisać. Breeze może je nazwać dobrze. Nie musisz korzystać z funkcji zapytań Breeze dla każdego żądania.Nadal będziesz korzystać z buforowania, nawigacji związanej z jednostkami, śledzenia zmian, sprawdzania poprawności, składowania w pakietach, wysyłania zapytań do pamięci podręcznej, obsługi offline.

Powtórz: Twoje metody serwisowe nie muszą zwracać IQueryable. Nawet gdy zwracają IQueryable, możesz łatwo napisać metodę usługi, aby ograniczyć wyniki kwerend do tylko tych elementów, które użytkownik ma uprawnienia do wyświetlania.

Na szczęście można połączyć oba podejścia w tej samej usłudze lub w usługach współpracujących.

Breeze daje ci wybór. Od Ciebie zależy, czy mądrze wybierzesz te opcje. Wyjdź tam i zaprojektuj swoje usługi, aby spełnić Twoje wymagania.

+2

Im bardziej odkrywam bryza i oczywiście stosuję te komentarze powyżej (co pozwala, by twarz była zdroworozsądkowa - łatwo "zobaczyć" rozwiązania techniczne jako pewnego rodzaju widok cyklopów świata!), Tym bardziej odczuwam rozmyte, ciepłe uczucie, że wreszcie przeglądarka i świat serwerów są wreszcie połączone :) –

4

Bryza nie jest przeznaczona do być Twojej logiki biznesowej w tym sensie. Mając na uwadze regułę, że jeśli robisz coś w JavaScript, każdy może to zrobić, powinieneś ograniczać widoczność własnych danych usługi w razie potrzeby.

Innymi słowy, przydaje się to, jeśli chcesz, aby dane były publicznie widoczne. Ale ujawniaj tylko te podmioty, które są szczęśliwe, ujawniając i pozwalając każdemu na zapytanie; innym sposobem patrzenia na to jest to, że twój interfejs API staje się publicznym interfejsem API dla twojej witryny (ale nie takim, który reklamujesz i mówisz wszystkim, aby go użył).

Jestem osobiście nie jestem fanem robienia rzeczy w ten sposób, ponieważ istnieje zależność utworzona na schemacie realizacji backendu. Jeśli chcę wprowadzić zmiany w tabelach baz danych, muszę wziąć pod uwagę moją JavaScript. Brakuje mi także integracji i testów jednostkowych.

Jednak może mieć swoje zastosowania, jeśli chcesz szybko zbudować funkcję strony internetowej na niewrażliwych danych bez konieczności budowania metod obsługi i różnych warstw jej wdrażania.

+0

Hej, dobra odpowiedź, dziękuję. Sądzę, że zastanawiałem się nad tą samą ścieżką: ujawniając tylko te dane, które naprawdę chcesz, tj. Jeśli twój model miał kilka właściwości, w tym przedmioty, które nie powinny być widoczne na zewnątrz, a następnie za pomocą DTO przenieść tylko te elementy, które chcesz widzieć . Chyba chciałem uzyskać jakieś potwierdzenie w tej sprawie, na wypadek gdyby coś przeoczyłem, więc jeszcze raz dziękuję za odpowiedź. –

+4

Z pewnością możesz ujawnić tylko to, co chcesz, za pośrednictwem DTO w swoim interfejsie API sieci Web, a następnie Breeze może tylko do nich dotrzeć. Myślę, że temat twoich zmian DB naprawdę nie obejmuje wody praktycznie. Jeśli dodasz pole do tabeli, musisz zaktualizować kod w swoich modelach biznesowych. Możesz zrezygnować z aktualizacji DTO, a zmiany nie będą miały żadnego wpływu na JavaScript. A więc istnieją sposoby na to, ze wzorami separacji. –

+0

Myślę, że nie ma wody; Zmiany DB nie ograniczają się tylko do dodawania kolumny do tabeli. Możesz usunąć kolumnę, przenieść tabele, podzielić tabele, zmienić dostawców DB. Jeśli mam interfejs API, chciałbym zachować separację, aby zmiana schematu nie wpłynęła na klienta. Tylko wtedy, gdy moja umowa z interfejsem wymaga zmiany, z przyjemnością wypróbuję wersję API i poinformuję klienta. Jest to oddzielenie, które utrudnia model zapytań po stronie klienta. – Mendhak

4

Co zrobić, gdy eksponujesz metadane? Czy nie jest to uważane za niebezpieczne. IMHO nie może bezpiecznie ujawniać metadanych z DbContext. Wiem, że możesz konstruować metadane na kliencie, ale chodzi o to, aby robić rzeczy tak szybko, jak to możliwe (jeśli jest to bezpieczne).

+1

Co sprawia, że ​​metadane są niebezpieczne? Gdzie informacje o typie znajdują się wśród wszystkich twoich zagrożeń bezpieczeństwa? Cóż, najlepiej jest zminimalizować niskie ryzyko, jeśli możesz to zrobić przy rozsądnych kosztach bez uszczerbku dla funkcjonalności. Na szczęście jest to bardzo proste informacje typu w/r/t. Nie musisz ujawniać całego modelu biznesowego, tylko typy dozwolone na kliencie. Ograniczenie do tych typów może być tak proste, jak ograniczenie powierzchni DbContext do obsługi modelu aplikacji klienta. A jeśli obiekty istnieją na kliencie, co metadane mówią, że obiekt na kliencie nie działa? – Ward

Powiązane problemy