Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Czy te dwie funkcje są przesadą dla odkażania?

Szczerze mówiąc, myślę, że autor tych funkcji albo nie ma pojęcia, czym są iniekcje XSS i SQL, ani co dokładnie robi użyta funkcja.

Wystarczy wymienić dwie osobliwości:

Ponadto:Generalnie funkcje chroniące przed XSS nie nadają się do ochrony przed wstrzyknięciami SQL i na odwrót. Ponieważ każdy język i kontekst ma swoje własne znaki specjalne, o które należy zadbać.

Moja rada to dowiedzieć się, dlaczego i jak możliwe jest wstrzykiwanie kodu oraz jak się przed nim chronić. Naucz się języków, z którymi pracujesz, zwłaszcza znaków specjalnych i sposobów ich unikania.

Edytuj Oto (prawdopodobnie dziwny) przykład:wyobraź sobie, że pozwalasz użytkownikom na wprowadzenie pewnej wartości, która powinna być użyta jako segment ścieżki w identyfikatorze URI, którego używasz w kodzie JavaScript w onclick wartość atrybutu. Kontekst językowy wygląda więc tak:

  • Wartość atrybutu HTML
    • Ciąg JavaScript
      • Segment ścieżki URI

I żeby było fajniej:przechowujesz tę wartość wejściową w bazie danych.

Teraz, aby poprawnie przechowywać tę wartość wejściową w swojej bazie danych, wystarczy użyć odpowiedniego kodowania dla kontekstu, w którym zamierzasz wstawić tę wartość do języka bazy danych (np. SQL); reszta nie ma znaczenia (jeszcze). Ponieważ chcesz wstawić go do deklaracji ciągu SQL, kontekstowe znaki specjalne są znakami, które umożliwiają zmianę tego kontekstu. Jeśli chodzi o deklaracje ciągów, te znaki to (zwłaszcza) " , ' i \ postacie, które należy uciec. Ale jak już wspomniano, przygotowane oświadczenia robią wszystko, co działa dla Ciebie, więc używaj ich.

Teraz, gdy masz już wartość w swojej bazie danych, chcemy ją poprawnie wyprowadzić. Tutaj przechodzimy od najbardziej wewnętrznego do zewnętrznego kontekstu i stosujemy właściwe kodowanie w każdym kontekście:

  • Dla segmentu ścieżki URI kontekst musimy uciec (przynajmniej) od wszystkich tych znaków, które pozwalają nam zmienić ten kontekst; w tym przypadku / (pozostaw bieżący segment ścieżki), ? i # (oba opuszczają kontekst ścieżki identyfikatora URI). Możemy użyć rawurlencode za to.
  • Dla ciągu JavaScript kontekst, o który musimy zadbać " , ' i \ . Możemy użyć json_encode w tym celu (jeśli jest dostępny).
  • Dla wartości atrybutu HTML musimy zadbać o & , " , ' i < . Możemy użyć htmlspecialchars za to.

Teraz wszystko razem:

'… onclick="'.htmlspecialchars('window.open("http://example.com/'.json_encode(rawurlencode($row['user-input'])).'")').'" …'

Teraz, jeśli $row['user-input'] to "bar/baz" wyjście to:

… onclick="window.open(&quot;http://example.com/&quot;%22bar%2Fbaz%22&quot;&quot;)" …

Ale używanie wszystkich tych funkcji w tych kontekstach nie jest przesadą. Ponieważ chociaż konteksty mogą mieć podobne znaki specjalne, mają różne sekwencje specjalne. URI ma tak zwane kodowanie procentowe, JavaScript ma sekwencje specjalne, takie jak \" a HTML ma odwołania do znaków, takie jak " . A nieużywanie tylko jednej z tych funkcji pozwoli na przerwanie kontekstu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak obliczyć średnią sprzedaż tygodniową w MySQL?

  2. Jak przeprowadzić migrację w laravel 5.5?

  3. Czas przechowywania MySQL - typ danych?

  4. MySQL - Używanie If Then Else w MySQL UPDATE lub SELECT Query

  5. MySQL - Mac - Błąd 2002 - Nie można połączyć się z lokalnym... przez gniazdo