Pytanie:
SQL injection is 17 years old. Why is it still around?
Ishan Mathur
2016-06-27 10:13:09 UTC
view on stackexchange narkive permalink

Nie jestem specjalistą i chciałbym, żebyś miał doświadczenie w zrozumieniu tego. Niedawno przeczytałem szczegółowy artykuł o SQLi w artykule badawczym.

Wydaje mi się to dziwne. Dlaczego tak wiele naruszeń danych nadal ma miejsce w wyniku iniekcji SQL? Czy nie ma rozwiązania?

Komentarze nie służą do rozszerzonej dyskusji;ta rozmowa została [przeniesiona do czatu] (http://chat.stackexchange.com/rooms/41748/discussion-on-question-by-ishan-mathur-sql-injection-is-17-years-old-why-jest-to).
Wiesz, że malaria wciąż istnieje, prawda?i to faktycznie zabija ludzi.
Exploity powodujące przepełnienie bufora istnieją od * ponad 30 lat *, ale nadal są popularne, mimo że producentom naprawdę nie jest tak trudno je naprawić.
Zapytałbym to samo o SQL.
Klienci, którzy nie znają się na technologii, po prostu nie płacą za zmiany kodu, dopóki nie zobaczą, że dzieje się coś złego, co szkodzi ich wynikom finansowym: „To nie jest w budżecie!”, „Nie widzę problemu, działało dobrze przez ostatnie 15 lat”. Nie wiedzą, że zostali zhakowani przez wstrzyknięcie SQL, ponieważ nigdy nie sprawdzają dzienników serwera, a haker nigdy nie jest na tyle miły, aby wysłać im e-mail ...
Po tysiącach lat noszenia spodni wyrywanie ludziom kieszeni jest nadal „rzeczą”.
Pasy bezpieczeństwa są używane od ponad 17 lat i niektórzy nadal ich nie używają.Wstrzykiwanie SQL będzie zawsze dostępne, ponieważ masz zaufanych użytkowników, którzy muszą pisać bezpośrednie zapytania.Jeśli masz niezaufane dane (użytkownika), istnieją niezawodne narzędzia (przygotowane / sparametryzowane) do zapytań, które w 100% zapobiegają wstrzyknięciu.
Moim zdaniem sprowadza się to do użytkowników (lub kupujących, a to prawie to samo w przypadkach, gdy kupowane jest oprogramowanie).Są skłonni zapłacić mniej za tanie śmieci, a nie więcej za solidne programy.Jest to oczywiście dużo większe zagadnienie niż tylko w branży komputerowej, ale sprowadza się to do tego, że dodatkowy czas na poprawne zapobieganie wstrzykiwaniu SQL nie jest tego wart dla firmy, a oni płacą nasze wypłaty.
Komunikat „Czy nie ma * poprawki *?”sformułowanie sprawia, że podejrzewam nieporozumienie: SQLi nie jest „błędem”, który należy * naprawić. * Pytanie może zostać przeformułowane jako: „Dlaczego nie opracowano w 100% niezawodnego, automatycznego sposobu blokowania SQLi?”Odpowiedź jest taka, że nie ma w 100% niezawodnego, zautomatyzowanego sposobu na odróżnienie legalnego SQL od nielegalnego.Tylko projektant aplikacji będzie wiedział, czy przesłany tekst powinien zezwalać na SQL, czy nie.Dlatego projektant powinien wdrożyć różne zabezpieczenia wymienione w innych odpowiedziach.
Szesnaście odpowiedzi:
Steffen Ullrich
2016-06-27 10:25:48 UTC
view on stackexchange narkive permalink

Nie ma ogólnego rozwiązania dla SQLi, ponieważ nie ma rozwiązania dla ludzkiej głupoty. Istnieją ustalone techniki, które są łatwe w użyciu i które rozwiązują problemy (zwłaszcza wiązanie parametrów), ale nadal trzeba ich używać. Wielu programistów po prostu nie zdaje sobie sprawy z problemów z bezpieczeństwem. Najbardziej dba o to, aby aplikacja w ogóle działała i nie przejmowała się zbytnio bezpieczeństwem, zwłaszcza jeśli sprawia, że ​​(nawet nieznacznie) jest bardziej złożona i wiąże się z dodatkowymi kosztami, takimi jak testowanie.

Ten rodzaj problemu nie ogranicza się do SQLi, ale można go znaleźć w przypadku przepełnienia bufora, sprawdzania certyfikatów, XSS, CSRF .... Bezpieczne programowanie jest droższe z powodu dodatkowych testów i dodatkowej wiedzy potrzebnej (a więc droższemu) programistowi. Tak długo, jak rynek preferuje tanie i nie dba o bezpieczeństwo, dostajesz tanie i niepewne rozwiązania. I chociaż bezpieczeństwo zgodne z projektem bardzo pomaga w ulepszaniu go, programiści często omijają ten projekt, ponieważ go nie rozumieją i po prostu przeszkadza.

Brak świadomości i lenistwo ...
„Nie ma ogólnego rozwiązania dla SQLi, ponieważ nie ma rozwiązania dla ludzkiej głupoty”.To piękny cytat!
Istnieją ogólne poprawki dla sqli, tak jak istnieją poprawki dla przepełnienia bufora, obejmują one pracę z konstrukcjami wyższego poziomu, które nie pozwalają na ich wystąpienie.Praca z większością języków zarządzanych rozwiązuje problemy z przepełnieniem bufora, dzięki technologiom takim jak linq fix sqli.Sqli będzie dostępny tak długo, jak długo ludzie będą używać sql bezpośrednio, ale już go nie ma dla tych, którzy tego chcą
Nie zawsze jest to ludzka głupota (przynajmniej nie ze strony dewelopera)!Znam wiele brazylijskich firm, które robią tu tanie statystyki: zatrudniają zamiast pełnoprawnych programistów, zatrudniają grupę stażystów, aby uniknąć podatków i płacić mniej swoim pracownikom.A to są duże firmy!Tacy juniorzy nie mają jeszcze żadnej wiedzy (niektórzy są na pierwszym semestrze studiów) ani nawet świadomości takich problemów i są odpowiedzialni za budowanie systemów, które oczywiście będą wadliwe.Za dużo tego tu widziałem.Mógłbym podać nawet od 5 do 6 nazw.To naprawdę smutna rzecz.
@Malavos: Niekoniecznie mam na myśli głupotę dewelopera.Zatrudnianie programistów na podstawie wynagrodzenia zamiast wiedzy też jest głupie.
** Komentarze nie służą do rozszerzonej dyskusji **;ta rozmowa została [przeniesiona do czatu] (http://chat.stackexchange.com/rooms/41757/discussion-on-answer-by-steffen-ullrich-sql-injection-is-17-years-old-why-jest-to).
„ponieważ nie ma rozwiązania dla ludzkiej głupoty” Dlaczego więc ludzie wciąż są w pobliżu?
@Malavos Podzielam Twoje zdanie.Straciłem rachubę, ile systemów musiałem naprawić, które zostały zbudowane przez „tego stażystę, który pracował tu wcześniej”.Jako inny brazylijski programista mogę również stwierdzić, że dzieje się tak wszędzie w tym kraju!
@Turion, daj mu [trochę więcej czasu] (https://books.google.com/books?hl=en&lr=&id=gUXgpH6nizIC).Jest [3 minuty do północy] (http://thebulletin.org/timeline)
Wstrzyknięcie nie jest awarią języka lub platformy;jest to błąd programisty.Nie można rozwiązywać problemów ludzi za pomocą rozwiązań technologicznych (chociaż można je pokryć, na przykład sparametryzowane zapytania mogą obejmować luki w zabezpieczeniach wstrzykiwania).
Myślę, że porównanie do niektórych chorób działa w ten sposób, że chociaż uzyskanie SQLi jest możliwe I częste, istnieją sprawdzone dobrze znane sposoby na uniknięcie tego.Nie jest to luka, którą „dostajesz” z powodu złego pobrania, a następnie system umiera.Możesz uniknąć wielu chorób, postępując zgodnie z pewnymi wskazówkami, ale ludzie nadal chorują z powodu braku mycia rąk lub nieprawidłowego gotowania jedzenia.
Dopóki nie ma ognia, dobrze jest nie zabezpieczać domu przed ogniem.
ale… można to naprawić, nie mając SQL
Śmierć reguluje ludzką głupotę.
TessellatingHeckler
2016-06-27 22:10:40 UTC
view on stackexchange narkive permalink

Ponieważ to nie jest problem.

  • Kiedy ostatnio firma z luką w zabezpieczeniach SQL injection została postawiona przed sądem i ukarana dużą grzywną za lekkomyślność dane użytkownika, a dyrektorzy ostrzeżeni, ukarani grzywną lub skazani za zaniedbanie?

  • Kiedy ostatnio firma straciła duży kontrakt, ponieważ strona logowania do witryny firmy nie sprawdzić poprawność haseł?

  • Kiedy ostatni raz wykwalifikowany regulator / audytor z profesjonalnej organizacji musiał zatwierdzić i podpisać publiczny system komputerowy, zanim mógł zostać oddany do użytku ?

Można by pomyśleć, że „ludzie umrą” to wystarczający powód, aby budować budynki z materiałów ognioodpornych, alarmów i dobrych dróg ewakuacyjnych. To nie było. Wprowadziliśmy przepisy, które narzucają niepalne materiały budowlane, konstrukcje przeciwpożarowe z przerwami przeciwpożarowymi, alarmy przeciwpożarowe.

Możesz pomyśleć, że „ludzie umrą” to wystarczający powód, aby wszystkich dbają o projekt konstrukcyjny budynku. To nie jest. Po prostu nie jest. Musimy mieć regulacje, aby wykwalifikowani inżynierowie podpisywali projekty budynków, aby były projektowane i budowane do określonych zastosowań, a gdy coś zawodzi, społeczeństwo pozywa inżynierów do sądu.

Można by pomyśleć, że „ludzie umrą” to wystarczający powód, aby uczynić przetwarzanie żywności czystym i bezpiecznym, ale tak nie było.

SQL Injection jest mniej oczywisty, mniej widoczny publicznie, ma mniejszy wpływ i znajduje się w całkowicie nieuregulowanej branży.

Nawet firmom, którym na tym zależy, nie mogą pożytecznie reklamować „ Żadnych znanych luk w zabezpieczeniach SQL injection w naszym kodzie ” jako marketingowego punktu, na którym komukolwiek zależy. To nie jest pytanie, które klienci zadają sprzedawcom. To nie jest dla nich przewaga konkurencyjna, to koszt, narzut. Ochrona przed tym sprawia, że ​​są mniej konkurencyjni, wolniej się poruszają, wykonują więcej pracy przy tej samej funkcjonalności.

Wszystkie zachęty są dostosowane do tego, aby nadal istniał. Więc nadal istnieje.

Niech wstrzyknięcie SQL będzie problemem dla firm, a one znikną.

[Edytuj: Ale istnieje rozporządzenie UE, zgodnie z którym strony internetowe muszą Cię ostrzegać, jeśli używają plików cookie. I robią. Tak więc regulacja publicznych systemów komputerowych, aby były bardziej irytujące, może wejść w życie - nawet jeśli obecne przepisy są dość bezużyteczne.]

Komentarze nie służą do rozszerzonej dyskusji;ta rozmowa została [przeniesiona do czatu] (http://chat.stackexchange.com/rooms/41860/discussion-on-answer-by-tessellatingheckler-sql-injection-is-17-years-old-why-i).
Zastanawiam się, kiedy nadejdzie czas na wprowadzenie przepisów związanych z informatyką
Uważaj, czego sobie życzysz @prusswan.Przynajmniej w Stanach Zjednoczonych zdecydowana większość obowiązujących lub próbowanych przepisów regulujących technologię została wprowadzona przez lobbystów bez znajomości całościowego obrazu.
cóż, niektóre przepisy są lepsze niż ich brak
@prusswan Obalam twój argument w ten sposób: żadne ustawodawstwo nie jest lepsze od złego.
[Przepisy dotyczące powiadamiania o naruszeniach bezpieczeństwa] (https://en.wikipedia.org/wiki/Security_breach_notification_laws) to problemy firmy.
@prusswan, istnieją prawa.Zajrzyj na przykład do HIPPA.
@prusswan Naprawdę?Wolisz mieć * jakiekolwiek * ustawodawstwo niż brak ustawodawstwa?A co, jeśli te przepisy wymagają, aby szyfrowanie miało backdoora?A co, jeśli te przepisy zmusiły cię do używania md5 do wszystkiego?Co by się stało, gdyby te przepisy wymagały od ciebie przechowywania wszystkich haseł w postaci zwykłego tekstu, niezaszyfrowanego i niesolonego?Czy jesteś * absolutnie pewien *, że * niektóre przepisy * są lepsze niż * brak przepisów *?
żadne ustawodawstwo nie sugeruje, że zawód jako całość niechętnie przyjmuje odpowiedzialność i nie można go traktować poważniej.Jeśli ustawodawstwo jest złe, napraw je, a jeszcze lepiej, wprowadź dobre ustawodawstwo, zanim ktoś inny wprowadzi złe
HIPAA ma związek ze zdrowiem, więc wszystko inne jest uczciwą grą?
ująć w ten sposób: czy wolisz napisać własny SQL, czy pozwolić Trumpowi napisać go za Ciebie?
Luis Casillas
2016-06-27 10:49:40 UTC
view on stackexchange narkive permalink

Wstrzykiwanie SQL wciąż istnieje, ponieważ świat oprogramowania nadal nie rozumie, że programistyczne generowanie wartości w strukturze drzewa (takich jak zapytania lub znaczniki) powinno odbywać się poprzez konstruowanie drzew składni jako obiektów pierwszej klasy , a nie przez konkatenację łańcuchów, które reprezentują fragmenty języka.

W ostatnich latach nastąpił niewielki postęp wraz ze wzrostem dostępności narzędzi do tworzenia zapytań, takich jak LINQ to SQL lub SQLAlchemy, ale to po stronie języka programowania. Relacyjne bazy danych nadal nie oferują standardowego, atrakcyjnego alternatywnego interfejsu, który nie jest zasadniczo oparty na wysyłaniu zapytań w postaci ciągów.

Przygotowane instrukcje z parametrami zapytań nie są poprawą, ponieważ są łatwe w użyciu tylko wtedy, gdy struktura Twoich zapytań - które tabele są połączone, jakie warunki filtrowania, jakie kolumny mają zostać zaprojektowane - jest stała . Gdy masz aplikację, która musi konstruować tekst zapytania w czasie wykonywania, użycie przygotowanych parametrów zapytania jest dużym problemem.

Tak więc, gdyby można było skonstruować ustandaryzowany, nietekstowy protokół o strukturze drzewiastej do opisywania i przekazywania zapytań do bazy danych, i zostałby zaprojektowany tak, aby był łatwiejszy w użyciu niż zapytania tekstowe, wtedy to rozwiązałoby problem problem w dłuższej perspektywie. Ale problem nie zniknie, dopóki branża nie przyjmie czegoś, na czym ścieżka najmniejszego oporu jest bezpieczna. Tak długo, jak będziemy nalegać na niebezpieczne domyślnie systemy, w których pisanie bezpiecznego kodu wymaga niepotrzebnego wysiłku, będą z nami problemy. (Pomyśl o wszystkich przepełnieniach bufora, które w ogóle nie istnieją w językach zarządzanych pamięcią!)


Zwróć uwagę, że ten sam fundamentalny problem, co wstrzyknięcie SQL, nęka sieć, pod nazwą cross-site scripting - co w rzeczywistości jest po prostu wstawieniem JavaScript do dynamicznych stron HTML. Bardzo częstym wzorcem są programiści Javascript, którzy zamiast pracować z DOM traktując go jak drzewo obiektów, używają właściwości innerHTML , aby ustawić go na tekst HTML, który zbudowany przez naiwną konkatenację ciągów. Wiele luk w zabezpieczeniach XSS nigdy by nie istniało, gdyby właściwość innerHTML nigdy nie została umieszczona w implementacjach DOM przeglądarek.


Ponadto, dla osób, które nie widziały przemówienia Tony'ego Hoare'a na temat wskaźników zerowych, jest ono jednocześnie ortogonalne (wskaźniki zerowe, nie wstrzyknięcia SQL), ale jednocześnie niezwykle istotne:

** Relacyjne bazy danych nadal nie oferują standardu ... wysyłania zapytań w postaci ciągów. ** Dostęp do bazy danych jest możliwy przez sieci, więc API do generowania zabezpieczonych zapytań jest zawsze po stronie aplikacji.Co więcej, wymagałoby to od nich wdrożenia tego rozwiązania we wszystkich językach.Zaimplementowali już sterowniki do komunikacji, wykonywania transakcji i ułatwiają sparametryzowane zapytania.Nie sądzę, żebyśmy mogli prosić o więcej po ich stronie.
Komentarze nie służą do rozszerzonej dyskusji;ta rozmowa została [przeniesiona do czatu] (http://chat.stackexchange.com/rooms/41756/discussion-on-answer-by-luis-casillas-sql-injection-is-17-years-old-why-czy to jest).
Nie sądzę, by było coś złego w używaniu `innerHTML`, gdyby ograniczało się do tworzenia anonimowych obiektów tekstowych.O wiele bardziej praktyczna jest możliwość ustawienia pola na „To jest ważne : cokolwiek” zamiast tworzenia i wstawiania oddzielnego zagnieżdżonego obiektu dla pogrubionego tekstu.Niestety, nie znam żadnego mechanizmu tworzenia takiego agregatu, który byłby po prostu niezdolny do tworzenia bardziej „niebezpiecznych” rodzajów obiektów.
Nie mogę wystarczająco zagłosować za tą odpowiedzią.Mówię to od dziesięcioleci, wspaniale jest słyszeć co najmniej jedną osobę, która to mówi.
Jeśli chodzi o najbardziej trywialne luki w zabezpieczeniach wynikające z naiwnego użycia konkatenacji ciągów, są one nadal powszechne w kodzie napisanym przez ludzi, którzy nie wiedzą, co robią, ponieważ ** mniej bezpieczne interfejsy API nie zostały usunięte **.Gdyby interfejs DB działał w PHP i innych językach całkowicie usunąłby stare API z płaskimi łańcuchami (zrywając mnóstwo istniejącego kodu), dużo kodu homebrew napisanego przez ludzi, którzy tak naprawdę nie wiedzą, jak programować, byłoby nieco bezpieczniejsze.
Istnienie starych samouczków uczących w zły sposób jest również poważnym problemem dla rzeczy takich jak PHP, gdzie dużo kodu jest kopiowanych i wklejanych przez osoby, które go nie rozumieją.
Jestem programistą SQL i nie zgadzam się z następującym stwierdzeniem: „Gdy masz aplikację, która musi tworzyć tekst zapytania w czasie wykonywania, używanie przygotowanych parametrów zapytania jest bardzo trudne”.Utworzenie bezpiecznego zapytania w programie nie jest trudniejsze niż ręczne.
@PeterCordes Korzystanie z bezpieczniejszych interfejsów API nie zmusi ludzi do rezygnacji z łączenia ciągów.Jak by to było?Możesz łatwo zrobić `$ db-> buildQuery (" select * from users where username = '$ username' ") -> execute ()` lub podobnie.
Nie zgadzam się, że używanie parametrów jest trudne w dynamicznym budowaniu zapytań.To wcale nie jest trudne - kiedyś musieliśmy opracować własne rozwiązanie przypominające hibernację dla własnego projektu i parametry, z którymi radzi sobie jedna z najłatwiejszych części.
Bardzo podoba mi się jego odpowiedź i byłbym bardzo zainteresowany zobaczeniem takiego rozwiązania opartego na drzewie składni.Jednak, jak mówi Steffen Ullrich, ludzka głupota nie zna granic, więc założę się, że byliby ludzie, którzy zbudowaliby to drzewo składni, łącząc ciągi znaków, a następnie używając wisiorka ewaluacyjnego swojego ulubionego języka, aby przekształcić je w rzeczywistą strukturę danych.Zatem mielibyśmy dwie ziejące luki w zabezpieczeniach, z których na początku była tylko jedna.:-(
Nick Gammon
2016-06-27 12:23:35 UTC
view on stackexchange narkive permalink

Podczas testowania bardzo łatwo jest sprawdzić, czego spodziewasz się , że się wydarzy. Na przykład, wypełniając pole „imię” w bazie danych, prawdopodobnie wybierzesz coś, co znasz, na przykład „Jan Kowalski”. To działa, a Twoja aplikacja wydaje się działać dobrze.

Pewnego dnia ktoś nadaje dziecku imię Robert '); DROP TABLE Studenci; - (małe tabelki Bobby'ego).

enter image description here

Oczywiście nie testujesz aplikacji pod kątem takich nazw , więc luka w zabezpieczeniach, którą ujawnia taka nazwa, wymyka się wszystkim testom.

Jest tutaj interesujący komentarz: Niesprawiedliwość roszczeń dotyczących zabezpieczeń

To łatwo udowodnić, że istnieje luka w zabezpieczeniach (wystarczy przetestować ją pod kątem nazwy takiej jak powyżej). Łatwo też udowodnić, że dana dziura została naprawiona. Trudno jest udowodnić, że nie ma innych luk w zabezpieczeniach.

Chociaż nie obejmuje to wszystkich iniekcji SQL, wystarczy, że przetestowanie przy użyciu prostego cudzysłowu w nazwie lub znaku hash # obejmuje sporą część podatności aplikacji na wstrzykiwanie SQL.
@Walfrat Szkoda, że `O'Brien` może chcieć otworzyć konto.
+1 za doskonałą odpowiedź.Brak odpowiednich przypadków testowych jest (IMHO) lepszym powodem niż ludzka głupota czy błędy.Trudno powiedzieć, że coś, co jest poprawne funkcjonalnie dla istniejących przypadków testowych, jest „błędem”, a niestosowanie się do najlepszych praktyk nie jest tak naprawdę „głupotą”, a raczej brakiem wiedzy na ten temat.Gdyby przypadki testowe zawsze zawierały iniekcję SQL, problem nie pojawiałby się tak często, a najlepsze praktyki byłyby bardziej prawdopodobne.
@MichaelKjörling Czy O'Brian ma na imię * Bobby *?To może być problem ...
@MichaelKjörling Myślę, że punkt @Walfrat's polegał na tym, że dość łatwo jest przeprowadzić testy dla SQLi, po prostu dodając dziwne `` '' do testowych danych wejściowych.Nie sądzę, żeby chciał promować apostrofy filtrujące na poziomie aplikacji (chociaż widzę, jak można to zinterpretować jako takie).
Moja odpowiedź naprawdę próbowała odpowiedzieć na pytanie: * dlaczego problem nadal występuje po 17 latach? * Nie: * jak najlepiej naprawić wstrzykiwanie SQL. *
Nie ma to jak konkretny przykład, który szybko i jasno wyjaśniłby problem.Nie mogę wystarczająco zagłosować za TĄ odpowiedzią ...
@MichaelKjörling to właściwie jeden * więcej * powód, by sprawdzić, czy działa z `` '' w nazwie, a nie mniej.(Niedawno w sklepie internetowym usunięto znak `+ 'z mojego adresu e-mail. Zamiast tego musieli wysłać mi pocztę papierową. Powinien też zostać przetestowany.)
Jeśli chodzi o kreskówkę XKCD, odkażanie danych wejściowych * nie * jest rozwiązaniem: renderowanie danych wejściowych do bazy danych * i * jakiekolwiek przetwarzanie danych w bazie danych, ponieważ rozwiązaniem jest impotent.Do czego służą parametry SQL i staranne rozważenie przetwarzania (np. Dynamiczny SQL).Konieczne jest również podobne podejście do renderowanego HTML.
h4ckNinja
2016-06-27 11:00:32 UTC
view on stackexchange narkive permalink

Steffen ma dobre uwagi w swojej odpowiedzi, ale chciałbym to dodać. Myślę, że powód można podzielić na następujące tematy:

  • Brak wiedzy lub wykształcenia programistów
  • Odejście w środowisku programistycznym przedsiębiorstwa
  • Presja, aby działać przed terminem
  • Niewystarczający nacisk z góry na bezpieczeństwo

Rozważmy to.

Szkolenie programistów

W dzisiejszych czasach duży nacisk kładzie się na edukację użytkowników. Naucz użytkowników, jak utrzymywać silne hasła. Naucz użytkowników, jak rozpoznawać phishing. Naucz użytkowników, jak ... Masz pomysł. Niektórych przedsiębiorstw zapewne dużo, ale mogę mówić tylko o swoim doświadczeniu zawodowym i nie pracowałem w wielu przedsiębiorstwach;), mam programy szkoleniowe. Ale te programy szkoleniowe mogą być niekompletne lub nie obejmować wymaganej wiedzy. Nie chodzi o dyskredytację ciężkiej pracy włożonej w tworzenie tych programów. Ale powiedzieć, że tak jak w środowisku szkolnym, różni ludzie uczą się inaczej. A jeśli nie masz programu kształcenia ustawicznego dla programistów, trudno będzie się komunikować „używaj zapytań parametrycznych, a oto jak to zrobić w PHP, Java, Python, Ruby, Scala, NodeJS, ...”. Tworzenie, dostarczanie i utrzymywanie programów deweloperskich, które skutecznie docierają do odbiorców, to ciężka praca.

Odejście deweloperów

Powyżej jedną z rzeczy, o których wspomniałem, było skuteczne docieranie do odbiorców w celu uzyskania różnych rodzajów uczenia się. Jednym z powodów jest to, że wiele przedsiębiorstw ma wysoki wskaźnik rezygnacji z deweloperów, ponieważ deweloperzy są wykonawcami, którzy są przenoszeni z projektu do projektu w różnych firmach. A firmy nie zawsze mają taką samą dojrzałość bezpieczeństwa. Jedna firma może w ogóle nie mieć programu bezpieczeństwa, podczas gdy inna może mieć doskonały program bezpieczeństwa, a programista jest nagle bombardowany nowymi informacjami, które będą od nich wymagane przez całe sześć miesięcy, zanim przeniosą się do innej firmy. To smutne, ale się zdarza.

Realizacja projektu

Realizacja projektu zgodnie z harmonogramem lub nawet przed terminem. Najszybszą drogą do ukończenia projektu zwykle niestety nie jest zakończenie projektu kontrolą bezpieczeństwa. Robi to w najbardziej zepsuty sposób, który wciąż działa. Wiemy, że przyniesie to więcej pracy, czasu i pieniędzy później, gdy przyjdzie czas na utrzymanie projektu i naprawienie problemów, ale zarząd chce tylko, aby projekt został usunięty.

opracowywanie programów szkoleniowych w zakresie bezpieczeństwa dla niezliczonych języków programowania. Wiele przedsiębiorstw nie ma jednego lub dwóch ustawionych języków. Dlatego programiści lubią (lub są do tego zachęcani) wypróbowywanie nowej wersji. Obejmuje to języki i frameworki. Oznacza to, że programy bezpieczeństwa muszą stale ewoluować.

Zaangażowanie kierownictwa

A oto zarządzanie. Za każdym razem wydaje się, że w przypadku naruszenia bezpieczeństwa publicznego istniały kontrole, które można było wdrożyć, które nie są takie trudne, ale zostały pominięte. Naciska na dostarczanie produktów jako pierwsze, a martwienie się zawsze na drugim miejscu, pomimo lekcji po lekcji, wraca do firm zajmujących się produktami. Kierownictwo musi naciskać od góry, aby na początku poświęcić trochę czasu na zbudowanie bezpieczeństwa. Muszą zrozumieć, że więcej pracy, więcej czasu i więcej pieniędzy zostanie przeznaczonych na naprawę problemów, konserwację produktu i zapłacenie kar. Jednak analizy kosztów i korzyści wskazują, że problemem jest dostawa produktu, a nie grzywny lub wymagane prace konserwacyjne. Te równania muszą się zmienić, a to częściowo sprowadza się do edukacji (wooo, pełne koło) na poziomie MBA. Menedżerów biznesowych trzeba nauczyć, że aby odnieść sukces w środowisku stale rosnących naruszeń, bezpieczeństwo musi być najważniejsze.

Podsumowanie

Dlaczego, mimo że SQLi ma prawie 20 lat , ma kilka powodów. Jako praktycy bezpieczeństwa możemy zrobić tylko tyle, aby edukować i podnosić świadomość tego, co się dzieje, gdy bezpieczeństwo nie jest uważane za integralną część SDLC.

„Szkolenie programistów”… Tak… czasami ludziom byłoby lepiej bez niego.Mój przyjaciel ukończył rzekomo akredytowany (cokolwiek to znaczy) kurs języka Java w Niemczech na początku tego roku.Gwiazdy w części SQL kursu?Konkatenacja ciągów znaków i metoda o nazwie `safe ()`, która uczyniłaby łańcuchy „bezpiecznymi” poprzez unikanie cudzysłowów - i tylko cudzysłowów.W ciągu 5 minut znalazłem 2-3 różne sposoby na wykonanie SQLi na przykładowym kodzie dostarczonym przez nauczyciela.Kto wie, co zautomatyzowane narzędzia do sondowania SQLi zrobiłyby z tego stosu kodu ...
Wtedy te programy są obsługiwane przez niekompetentnych ludzi.Ale to nie znaczy, że szkolenie programistów nie działa.Widziałem, jak to działa.Zamiast zakładać, że szkolenie programistów nie działa, spójrz na przyczynę niepowodzenia.Więc dobrze ...
Dodałbym: „Dostawcy baz danych próbujący wcisnąć wszystko do jednego połączenia”.Jeśli sposobem na uruchomienie jakiegoś sql jest zawsze wywołanie funkcji, która pobiera dowolny SQL, programiści muszą wykonać dużo pracy związanej z bezpieczeństwem.Sprzedawcy mogliby łatwo dodać funkcję (może nazwaną „select”?), Która umożliwia * tylko * * jeden * * select * - bez separatorów instrukcji, bez komentarzy, bez „upuszczania”, bez „aktualizacji” ....implementacja, łatwy w użyciu, całkiem bezpieczny i obejmuje * wiele * potrzeb użytkowników (zwłaszcza początkujących) - może więc znacznie zmniejszyć powierzchnię ataku.
@TextGeek Integracja między SQL Server a C # / .NET jest niesamowita.Masz kilka narzędzi do korzystania z bezpiecznych wyborów, aktualizacji i tak dalej - mimo to _ wiele_ programistów po prostu je ignoruje i od razu przechodzi do niebezpiecznych, ogólnych wywołań „po prostu wykonaj ten SQL”.
David Mulder
2016-06-28 01:01:45 UTC
view on stackexchange narkive permalink

Zgadzam się z wieloma odpowiedziami, ale nie jest powiedziane o jednej bardzo ważnej kwestii: kod nie naprawia się w magiczny sposób, a jest dużo kodu, który ma 17 lat. Widziałem wiele firm, które pisały czysty i bezpieczny nowy kod, podczas gdy aplikacja nadal mogłaby zostać zaatakowana w niektórych jej starszych sekcjach. A co najgorsze: naprawianie starego kodu jest kosztowne, ponieważ wymaga od programistów zagłębienia się w kod, który został napisany w innej erze z różnymi stylami kodowania i różnymi technologiami. Czasami naprawienie starego kodu tak, aby nie powodował wstrzyknięć SQL, wymagało odtworzenia całych bibliotek, które zostały odkupione w ciągu dnia (musiałem to zrobić kilka lat temu).

Nie mówiąc o tym cały nowy kod jest wolny od zastrzyków SQL, ale osobiście nie widziałem żadnego profesjonalnie napisanego nowego kodu w ciągu ostatnich 4 lub 5 lat, który je zawierał. (Jedynym wyjątkiem jest sytuacja, w której programiści muszą wykonać szybką i brudną naprawę w starym kodzie i użyć tego samego stylu / technologii, w której napisana jest reszta kodu).

Andy Lester
2016-07-07 00:58:08 UTC
view on stackexchange narkive permalink

Uważam, że dzieje się tak, ponieważ wielu programistów uczy się wystarczająco dużo, aby wykonać swoją pracę, dla pewnej wartości „skończonej”. Uczą się, jak budować kod SQL, często z przestarzałych samouczków online, a kiedy kod „działa” do tego stopnia, że ​​mogą powiedzieć „Mogę umieścić rzeczy w bazie danych i mogę wygenerować stronę wyników” Jestem zadowolony.

Weź pod uwagę tego gościa na drabinie:

Guy on a dangerous ladder

Dlaczego on to robi? Dlaczego nie ma odpowiedniego rusztowania? Ponieważ wykonuje swoją pracę. Umieść drabinę przy ścianie nad schodami i działa dobrze. Aż tak się nie stanie.

To samo z INSERT INTO users VALUES ($ _ POST ['user']) . Działa dobrze. Dopóki tak się nie stanie.

Inną rzeczą jest to, że nie są świadomi zagrożeń. Z facetem na niestabilnej drabinie rozumiemy grawitację i upadek. Budując instrukcje SQL na podstawie niepotwierdzonych danych zewnętrznych, nie wiedzą, co można zrobić.

W zeszłym miesiącu rozmawiałem z grupą użytkowników programistów internetowych, a z 15 programistów obecnych na widowni dwóch słyszało iniekcji SQL.

Bron Davies
2016-06-27 21:10:18 UTC
view on stackexchange narkive permalink

Myślę, że głównym powodem jest to, że szkolenie programistów nie zaczyna się od sprawdzonych metod, ale zaczyna się od zrozumienia języka. Dlatego nowi programiści, wierząc, że zostali przeszkoleni z narzędziami do tworzenia czegoś, kontynuują tworzenie zapytań w sposób, w jaki ich nauczono. Następnym i najniebezpieczniejszym krokiem jest umożliwienie komuś opracowania czegokolwiek bez przeglądu, a tym samym ciągła okazja do dokonywania mniej złych wyborów, nie wiedząc, że coś jest z nimi nie tak, i tworzenia dalszych nawyków, które ignorują ogólnie przyjęte w branży najlepsze praktyki. Podsumowując - słabo wyszkoleni programiści działający w środowisku, które nie ceni nic poza produktem końcowym.

Nie ma to nic wspólnego z inteligencją czy „ludzką głupotą”. Istnieje systematyczne podejście, które zostało dobrze zdefiniowane przez lata, a każdy, kto tworzy oprogramowanie, jest zaniedbaniem, aby zignorować ten proces w imię szybszej lub tańszej implementacji. Być może któregoś dnia konsekwencje prawne tego zachowania umożliwią nam wprowadzenie większej liczby kontroli, takich jak w branży medycznej lub budowlanej, gdzie nieprzestrzeganie tych zasad i przyjętych praktyk spowoduje utratę licencji lub inną karę.

Zgoda.google „przykłady sql”, a otrzymasz wiele przykładów wyrażeń SQL, z których żadne nie jest bezpieczne, ponieważ wszystkie są po prostu ciągami.Jeśli w ten sposób nauczysz się pisać SQL, to właśnie tego będziesz używał w swoim pierwszym projekcie ...
@MarkLakata To również moja obserwacja.Nowi ludzie w dużym stopniu polegają na Google.Google ma tendencję do wyciągania absolutnie okropnych przykładów ... Dynamiczne zapytania wybierające * dla jednej kolumny z naprawdę szerokich tabel.To zadziwiające, jak te okropne przykłady SQL pojawiają się na szczycie wyników wyszukiwania Google, z których korzystają nowi programiści.
Bob Ortiz
2016-06-27 14:15:16 UTC
view on stackexchange narkive permalink

Dlaczego luki w zabezpieczeniach typu SQL injection jeszcze nie wygasły? Mówiąc metaforycznie, z tego samego powodu, dla którego zdarzają się wypadki samochodowe od czasu pierwszego samochodu w 1895, a nawet najbardziej innowacyjnych i nowoczesnych samochodów samojezdnych, Tesla model S (na autopilocie) lub auto samojezdne Google od czasu do czasu ulega awarii.

Samochody są tworzone (i kontrolowane) przez ludzi, ludzie popełniają błędy.

Witryny i aplikacje (internetowe) są tworzone przez ludzi-programistów. Zwykle popełniają słabe błędy w projektowaniu zabezpieczeń lub mają tendencję do niszczenia rzeczy za pomocą „szybkich poprawek”, gdy coś jest bezpieczne, ale w rzeczywistości wprowadza nową lukę, na przykład dlatego, że czas / budżet na opracowanie poprawki był ograniczony, lub programista miał wielkiego kaca, kiedy pisał poprawkę .

Czy zawsze jest to spowodowane przez programistów? Zasadniczo tak, ale nie zawsze przez programistę pierwszej linii . Na przykład lokalny supermarket poprosił firmę zajmującą się tworzeniem stron internetowych o stworzenie dla nich strony internetowej. Deweloperzy wynajmują część współdzielonej przestrzeni hostingowej od firmy hostingowej do hostowania witryny i instalują WordPress oraz kilka przydatnych wtyczek.

Teraz programiści firmy zajmującej się tworzeniem stron internetowych niekoniecznie muszą popełniać błąd, wprowadzając lukę w zabezpieczeniach typu SQL injection, aby być podatnym na ataki. Co mogło się tutaj nie udać? Kilka przykładów:

  1. Firma hostingowa nie zaktualizowała PHP do najnowszej wersji, a używane wersje PHP okazały się ogólnie podatne na SQLi.
  2. Hosting firma skonfigurowała dodatkowe publiczne oprogramowanie, takie jak phpMyAdmin i nie zaktualizowała tego.
  3. Okazuje się, że używana wersja WordPress jest podatna na SQLi, ale aktualizacja została pominięta lub nie jest jeszcze dostępna łatka.
  4. Używana wtyczka WordPress jest podatna na SQLi.

Teraz pytanie, które się pojawia , kto jest za to odpowiedzialny? Supermarket, firma zajmująca się tworzeniem stron internetowych, firma hostingowa, społeczność WordPress, twórcy wtyczek WordPress lub osoba atakująca, która nadużyła luki, mówiąc retorycznie? - To nie jest stwierdzenie, jest przesadzone i tylko kilka pytań, które mogą być zadawane w przypadku, gdy coś pójdzie nie tak.

Często powyższa dyskusja (pytania dotyczące odpowiedzialności, choć nieco przesadzone) jest również czynnikiem ryzyka, ponieważ niektórzy programiści mają tendencję do „to nie moja kod „-attitude . Możesz sobie wyobrazić, jak skomplikowana jest to czasami sytuacja.

Korzystanie z samego Wordpressa należy uznać za lukę.
Samochody Tesli się rozbijają, ponieważ Tesla to coś w rodzaju luźnej armaty.Aby zobaczyć lepszy przykład, spójrz na samojezdne samochody Google.(Tesla dosłownie wbudowała funkcje samodzielnej jazdy bez mówienia nikomu, a następnie cicho włączyła ją dzięki ** aktualizacji oprogramowania **).
Nie sądzę, żeby wypadki samochodowe były dobrym porównaniem.Od 1895 r. Nie było sposobu, aby zapobiec wypadkom samochodowym i nastąpił postęp w ograniczaniu liczby wypadków (np. Białe linie na jezdni, światła mijania, lepsza konstrukcja skrzyżowań i świateł drogowych) i ich skutków (poduszki powietrzne, pasy bezpieczeństwa, strefy zgniotu).Natomiast iniekcja SQL może zostać całkowicie naprawiona przez zmianę projektu, kropkę.Nowoczesne samochody nie psują się, ponieważ firmy są słabo motywowane, nieświadome, leniwe lub niekompetentne - ale właśnie dlatego istnieje SQLi.
@EvanderConsus Firma zajmująca się tworzeniem stron internetowych.Zlecono im udostępnienie strony internetowej do użytku w Internecie i dostarczyli taką, która nie była odpowiednia do celu.Sugerowanie, że mogą nie być odpowiedzialni, ponieważ ich narzędzia były złe, po tym, jak wybrali bezpłatne, nieuzasadnione, nieobsługiwane narzędzia od nieznanych osób o nieznanych umiejętnościach, z wieloma znanymi wcześniejszymi lukami, jest po prostu głupie."* Zleciliśmy ci zbudowanie nowego budynku i on się zawalił *", "* to nie nasza wina, użyliśmy darmowej stali od jakichś amatorskich kowali domowych, skąd mogliśmy wiedzieć, że nie będzie wystarczająco mocna?"„och, ok”
Naprawdę nie rozumiem, co wypadki samochodowe mają wspólnego z wstrzyknięciem SQL.
@TessellatingHeckler Zgadzam się, że odpowiedzialność spoczywa na firmie deweloperskiej.Chciałbym jednak zauważyć, że drogie, objęte gwarancją narzędzia obsługiwane przez sprzedawców są również pisane przez nieznanych ludzi o nieznanych umiejętnościach.Ludzie, nawet wysoko opłacani ludzie w wysoko płatnych firmach, popełniają błędy, a ja byłbym ostrożny, gdybyśmy wydali ogólne oświadczenie (które prawie wydaje się, że robisz), że darmowa stal jest zawsze gorsza niż [drogie rzeczy] (https://www.cvedetails.com/vulnerability-list.php?vendor_id=93&product_id=467&version_id=&page=1&order=3).
@WanderNauta Evander zapytał: ** Teraz pojawia się pytanie, kto jest odpowiedzialny? ”* - nie twierdzę, że darmowa stal jest zawsze gorsza, mówię tylko, że nie możesz zrównoważyć swojej odpowiedzialności, wywołując„ open source! ”.podnieś wolną stal z ziemi, nie poddawaj jej testom metalurgicznym, a później okaże się, że jest słaba, * ty * jesteś odpowiedzialny. W tej odpowiedzi jest to wada we wtyczce Wordpress? Autor wtyczki nigdy nie zgodził się na żadną umowę, któranadawało się do dowolnego celu. Narzędzie sprzedawcy może nie być lepsze, ale jeśli sprzedają je jako nadające się do celu, nie jesteś za to odpowiedzialny.
Pytanie o odpowiedzialność jest rzeczywiście retoryczne, nie wypowiadałem się ani o open-source, ani o wysoko płatnych programistach (dlatego dodam to w mojej odpowiedzi).@Ellesedil Wypadki samochodowe rzeczywiście nie mają nic wspólnego z wstrzyknięciami SQL, ale jest to metaforyczny obraz retoryczny, w którym fraza odnosi się do czegoś, do czego nie ma dosłownie zastosowania, aby zasugerować podobieństwo.
@TessellatingHeckler Jestem ciekawy, jaka "zmiana projektu" naprawiłaby wstrzykiwanie SQL bez łamania prawej strony operatora `IN`.
@DamianYerrick projektuje twoją aplikację w taki sposób, że możesz rozmawiać z bazą danych tylko po ucieczce przed niekontrolowanymi danymi, używając dowolnych narzędzi ucieczki, które są odpowiednie dla twojej biblioteki / bazy danych.Po stronie bazy danych [PostgreSQL] (https://dba.stackexchange.com/a/55018) i [H2database] (https://stackoverflow.com/a/3724272/478656) wydają się mieć sposoby przekazywania tablic jakopojedyncze parametry, aby uniknąć tworzenia ciągów znaków w tym konkretnym celu.Oraz [wariacje] (https://stackoverflow.com/a/189399/478656) na temat budowania ciągów przygotowanego zapytania - pracochłonny, wolniejszy, ale jeszcze bezpieczniejszy projekt aplikacji.
Colin Cassidy
2016-06-27 17:05:17 UTC
view on stackexchange narkive permalink

Po pierwsze, nikt nie pisze poprawnie bezpiecznych wymagań, mówią coś w stylu „Produkt powinien być bezpieczny”, czego w żaden sposób nie da się przetestować.

Po drugie, deweloperzy zajmujący się zawodami nie są głupi, a mówienie tego jest raczej nieszczere, wszyscy prawdopodobnie mają wyższe wykształcenie i rozwiązują problemy, na które nawet nie zaczęliśmy zwracać uwagi ... Problem polega na tym, że nigdy nie uczono ich, co to jest bezpieczne tworzenie oprogramowania. Zaczyna się w szkołach, potem na uniwersytecie, a potem niezależnie od wykonywanej pracy, gdzie każde szkolenie odbywa się „w miejscu pracy”, ponieważ firmy programistyczne zbyt boją się szkolić programistów na wypadek ich odejścia.

Programiści też są pod rosnącą presją, aby wykonać więcej pracy w krótszym czasie, są zajęci naprawianiem jednego problemu i przejściem do następnego, jest mało czasu na zastanowienie się, gdy pojawi się następny problem.

Programiści nie są zachęcani do testowania poza tym, co opracowują, jeśli napotkają problem, prawdopodobnie będą programistą, który go naprawi. Mantra dewelopera brzmi: „Nie testuj tego, co nie jesteś przygotowany do naprawiania”.

Po trzecie, testerzy są również nie jest przeszkolony w znajdowaniu luk w zabezpieczeniach, z tego samego powodu co twórcy oprogramowania. W rzeczywistości wiele testów (moim zdaniem) to po prostu powtórzenie testów przeprowadzonych przez zespół programistów.

rynek to ogromny czynnik. Jeśli jesteś na rynku, najpierw zarabiasz, bezpieczny rozwój jest postrzegany jako mający duży wpływ na szybkość rozwoju - mam na myśli naprawdę, kto ma czas na model zagrożenia! ;)

Wreszcie nie chodzi tylko o zastrzyki SQL, przepełnienia buforów są znane od lat 60-tych i nadal można się o nie potykać z niepokojącą regularnością.

„Po drugie, zawodowi [wszyscy] deweloperzy nie są głupi… wszyscy prawdopodobnie mają stopnie naukowe”. Najmądrzejszy programista, jakiego zatrudniłem, miał dwuletni dyplom w szkole technicznej.Niektórzy z najgorszych mieli doktoraty.Kawałek papieru nie nasyca ani inteligencji, ani zdrowego rozsądku, a widziałem powszechny brak obu.Niestety środowisko akademickie ma tendencję do przedkładania papieru bardziej niż doświadczenia, więc nowi programiści uczą się niewłaściwych rzeczy, ponieważ ludzie prowadzący nauczanie sami nie wiedzą lepiej.
wciąż udowadnia, że nie są głupi.Pokazuje ogromną rozbieżność między środowiskiem akademickim a przemysłem w sposobie nauczania twórców oprogramowania.uczniowie uczą się języka de-jour, którym prawdopodobnie będzie javascript ... I jest to całkowicie niepraktyczne w obliczu rzeczywistych problemów lub niezawodności, skalowalności wydajności, nieczyszczonych danych itp. Itd ... wszystkie rzeczy, którymi musiałbyś zarządzać w aplikacjach.
Wydaje się, że uniwersytety po prostu uczą cię, jak brzmieć mądrze, nie wiedząc nic praktycznego.
Nie.W kontekście pierwotnego pytania w programie uniwersyteckim niewiele uwagi poświęca się bezpieczeństwu produktu
@colincassidy twój komentarz powinien przeczytać, nie ma żadnego skupienia się na bezpieczeństwie produktu w sylabusie uniwersyteckim.
Jedi
2016-06-29 21:58:06 UTC
view on stackexchange narkive permalink

Tak, antropologicznie ludzie są głupi.

Tak, z politycznego punktu widzenia, struktura motywacyjna niewystarczająco penalizuje wrażliwe aplikacje

Tak, proces jest wadliwy - kod jest napisane w pośpiechu; zły / stary kod jest nie zawsze wyrzucany.

I tak, technicznie rzecz biorąc, traktowanie i mieszanie danych jako kodu jest trudniejsze do zrobienia domyślnie.

Ale jest bardziej pozytywny pogląd (zignorujmy 99% luk w SQLi, które wyjaśniają powyższe odpowiedzi). SQLi nadal istnieje na bardzo dobrze zaprojektowanych i starannie opracowanych witrynach internetowych, ponieważ jesteśmy niesamowici . Zasada hakerów. Wystarczy spojrzeć na setki wektorów ataku i tysiące ładunków SQLi, które zostały opracowane w ciągu ostatnich siedemnastu lat, aby odzyskać wiarę w rasę ludzką. Z każdym rokiem prezentowane są nowe techniki DEFCON / BlackHat / RSA / IEEESSP. Programy nagród za błędy dla Facebooka, Google i tym podobnych musiały co najmniej raz wypatrywać krytycznego SQLi.

Częściowo wynika to ze złożoności i liczby warstw w naszym systemie, z których każda mutuje dane w nowszy i bardziej interesujący sposób. Coraz więcej potrzebujemy zrobić więcej, szybciej, przy użyciu mniejszych zasobów. Dopóki nie będziemy w stanie przetestować wszystkich ścieżek do systemu, nikt nie będzie certyfikował rozwiązania problemów z wtryskiem.

niilzon
2016-06-29 16:18:33 UTC
view on stackexchange narkive permalink

Ponieważ takie kwestie bezpieczeństwa nie są uwzględniane podczas większości 3-letnich cykli edukacyjnych i równoważnych studiów, a wielu programistów podążało tą ścieżką (w tym ja). Biorąc pod uwagę, jak szeroka jest ta dziedzina, w rzeczywistości 3 lata nie wystarczą nawet, aby poradzić sobie z rzeczywistym programem studiów. Więc rzeczy takie jak bezpieczeństwo zostały odrzucone.

To niefortunne, ale niektórzy nowi programiści wygrali Nigdy nie próbowali samodzielnie uczyć się nowych rzeczy, ci ludzie zawsze będą pisać kod podatny na SQLi, dopóki bardziej wykształcony kolega nie wskaże problemu (lub dopóki nie nastąpi faktyczny SQLi).

Podczas moich studiów (wiele lat temu) nasi nauczyciele zawsze mówili nam, abyśmy używali PreparedStatements przy tworzeniu ręcznych zapytań SQL, ponieważ jest to „najlepsza praktyka”, ale nie powiedzieli dlaczego. To lepsze niż nic, ale wciąż dość smutne. Nie jestem pewien, czy ci nauczyciele w ogóle znali siebie.

Dowiedzieliśmy się, jak wyświetlać rzeczy na jsp, ale nie czym jest Cross-Site-Scripting.

Mam szczęście, że jestem pasjonatem i mam trochę czasu na ręce, więc nauczyłem się tego wszystkiego samemu dawno temu, ale jestem pewien, że wielu programistów po prostu robi swoje 8 godzin dziennie (przy okazji z uzasadnionych powodów) i tak długo, jak nikt im tego nie pokazuje jest źle, to się nie zmieni.

Czasami niektórzy programiści nie doceniają ryzyka związanego z SQLi.
Zwykle to robią niewykształceni.Przypomina mi post na tej samej stronie, w którym uczeń miał problemy z zapytaniami.Pokazałem mu, jak sprawić, by kod działał, i wskazałem, że jest podatny na SQLi, sugerując refaktoryzację kodu za pomocą PreparedStatements. Jego odpowiedź brzmiała: „ale to tylko dla ćwiczeń klasowych, ten kod nie zostanie ponownie użyty, nie obchodzi mnie to”. Z taką postawą musimy walczyć.Kodowanie tak poprawne, jak to tylko możliwe przy każdej okazji, jest ważne, * zwłaszcza jeśli nie opanujesz zbyt dobrze tego, co robisz *.
Neil Davis
2016-06-29 06:54:18 UTC
view on stackexchange narkive permalink

Jeśli używasz poprawnie przygotowanych instrukcji, wstrzyknięcie SQL nie jest możliwe.

„Jeśli oryginalny szablon instrukcji nie pochodzi z danych wejściowych zewnętrznych, wstrzyknięcie SQL nie może wystąpić.”

https://en.m.wikipedia.org/wiki/ Prepared_statement

Niestety, ludzie zazwyczaj nie używają przygotowanych instrukcji poprawnie, jeśli w ogóle.

Wstrzyknięcie SQL byłoby przeszłością, gdyby tak było.

I tak, php / MySQL ma przygotowaną implementację instrukcji przez bardzo długi czas, ponad 10 lat, jeśli pamięć służy ...

mystupidstory
2016-07-04 04:49:27 UTC
view on stackexchange narkive permalink

Inne odpowiedzi wskazywały na prawie wszystkie przyczyny. Ale jest jeszcze coś, co moim zdaniem jest najbardziej niebezpieczne ze wszystkich. Programiści próbują dodawać coraz więcej funkcji do technologii i czasami odbiegają od rzeczywistego celu technologii. Trochę tak, jak język skryptowy po stronie klienta został użyty do kodowania po stronie serwera lub uzyskał dostęp do zdalnych zasobów, a także lokalnej pamięci po stronie klienta. Patrząc na niektóre zaawansowane zastrzyki SQL, możemy zobaczyć, jak odegrały one rolę w stałym akcentie ataków SQLi.

Jednak w przypadku SQL, wydaje mi się, że największym błędem było połączenie poleceń i parametrów. To trochę jak wywołanie run (value, printf) zamiast printf(value).

No i ostatnia rzecz, chociaż jest to dość łatwe konwertować między różnymi typami baz danych, zmiany wymagane w kodzie po stronie serwera są gigantyczne.

Ktoś powinien abstrahować między różnymi typami baz danych i ułatwiać przełączanie się między różnymi bazami danych. Powiedz wtyczkę php, która przyjmuje jako dane wejściowe polecenia QL i typ bazy danych i może być filtrem z białej listy, aby oczyścić dane wejściowe.

Brad Thomas
2016-06-29 23:06:56 UTC
view on stackexchange narkive permalink

Osobiście uważam, że jest to szczególny przypadek bardziej ogólnego problemu w programowaniu, w którym IDE i języki są zbyt liberalne. Dajemy naszym programistom ogromną moc w imię elastyczności i wydajności. Rezultatem jest „to, co może się stać, stanie się”, a luki w zabezpieczeniach są nieuniknione.

pppp
2016-06-28 11:30:50 UTC
view on stackexchange narkive permalink

PDO (lub inne „bezpieczne” metody) nie jest bezpieczniejsze niż mysql_ (lub inne „niebezpieczne” metody). Ułatwia to pisanie bezpiecznego kodu, ale jeszcze prostsze jest po prostu konkatenację ciągów znaków dostarczonych przez użytkownika bez zmiany znaczenia w zapytaniu i nie przejmowanie się parametrami.

Nie jestem pewien, czy to odpowiada na pytanie.Czy miał to być komentarz do innej odpowiedzi?
Myślę, że chciał powiedzieć, że powodem, dla którego SQL Injection nadal istnieje, jest to, że powyższe „bezpieczne metody” nie chronią w pełni przed wstrzyknięciami SQL i że ludzie muszą być świadomi, jak w pełni się chronić i upewnić się, że używasz bazy danych, którapotrafi poradzić sobie w potrzebnych sytuacjach.
Utrudnienie zapisu bezpiecznego kodu skutkuje większą liczbą błędów, a tym samym mniej bezpiecznym kodem.


To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...