Latest web development tutorials

MySQL i SQL injection

Jeśli masz dane wprowadzone przez użytkownika za pośrednictwem internetu i włóż ją do bazy danych MySQL, to jest możliwe, problemy bezpieczeństwa SQL injection.

W tym rozdziale dowiesz się, jak zapobiec SQL injection i filtrować SQL injection znaków w skrypcie.

Tzw SQL injection, to za pomocą polecenia SQL do formularza internetowego składania lub wprowadź nazwę domeny lub na żądanie strony łańcucha zapytania, a ostatecznie oszukać serwer do wykonywania poleceń SQL złośliwych.

Nigdy zaufania wejściowe użytkownika, musimy zidentyfikować dane wprowadzone przez użytkownika są niepewne, wszyscy potrzeba wprowadzania danych przez użytkownika procesu filtrowania danych.

Poniższy przykład, nazwa użytkownika wpisana musi być kombinacją liter, cyfr i znaków podkreślenia, a długość nazwy użytkownika wynosi między 8-20 znaków:

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
{
   $result = mysql_query("SELECT * FROM users 
                          WHERE username=$matches[0]");
}
 else 
{
   echo "username 输入异常";
}

Spójrzmy na sytuację, gdy nie ma filtra SQL pojawiają się znaki specjalne:

// 设定$name 中插入了我们不需要的SQL语句
$name = "Qadir'; DELETE FROM users;";
mysql_query("SELECT * FROM users WHERE name='{$name}'");

Powyższe stwierdzenie wtryskowego, nie mamy do filtrowania zmiennej $ name, $ nazwa nie musimy wstawić instrukcję SQL spowoduje usunięcie wszystkich danych w tabeli użytkowników.

mysql_query w PHP () nie może wykonywać wiele instrukcji SQL, ale w SQLite oraz PostgreSQL może wykonywać wiele instrukcji SQL jednocześnie, więc użytkownicy tych danych musimy ścisłą weryfikację.

Zapobiec SQL injection, musimy zwrócić uwagę na następujące punkty:

  • 1. Nigdy nie ufaj dane wprowadzone przez użytkownika. Weryfikacja danych wprowadzonych przez użytkownika, można użyć wyrażeń regularnych, lub ograniczyć długości, pojedyncze i podwójne znaki "-" w konwersji.
  • 2. Nigdy nie używać dynamicznego SQL montażu, można użyć parametrów bezpośredniego wykorzystania SQL lub procedur przechowywanych dostępu kwerendy danych.
  • 3. Nigdy nie używaj przywileje administratora połączenia z bazą danych, należy ograniczone uprawnienia indywidualne dla każdego połączenia z bazą danych aplikacji.
  • 4. Nie należy przechowywać poufne informacje bezpośrednio szyfrowania lub mieszania z haseł i poufnych informacji.
  • 5. Informacje wyjątkiem aplikacji należy podawać w kilku monitów, najlepiej jest użyć wiadomość oryginalnego opakowania niestandardowy komunikat o błędzie
  • Wykrywanie 6.sql miejscu wstrzyknięcia w ogólnym lub nośnej platformy oprogramowania do wykrywania, oprogramowanie powszechnie stosowane SQL injection jsky narzędzia wykrywania, strona internetowa strona internetowa mld myślenie nie ma narzędzi do wykrywania Security Platform. MDCSOFT SCAN podoba. Korzystanie MDCSOFT-IPS może być skuteczna obrona SQL injection, Ataki XSS.

Zapobieganie SQL injection

W językach skryptowych takich jak Perl i PHP można uciec od danych wprowadzonych przez użytkownika w celu uniknięcia SQL injection.

Rozszerzenie PHP MySQL udostępnia funkcję mysql_real_escape_string () do ucieczki znaki specjalne wejściowych.

if (get_magic_quotes_gpc()) 
{
  $name = stripslashes($name);
}
$name = mysql_real_escape_string($name);
mysql_query("SELECT * FROM users WHERE name='{$name}'");

Jak wstrzyknięciu wyciągu

jak zapytania, jeśli użytkownik wprowadzi wartość "_" i "%", to się dzieje: Użytkownik po prostu staramy zapytania "abcd_", tam wyniki kwerendy "abcd _", "ABCDE", "abcdf" itp użytkownikowi na zapytanie "30%" (uwaga: trzydzieści procent) będzie miał problemy.

W skrypcie PHP, możemy użyć addcslashes () do obsługi powyższym przypadku, następujące przykłady:

$sub = addcslashes(mysql_real_escape_string("%something_"), "%_");
// $sub == \%something\_
mysql_query("SELECT * FROM messages WHERE subject LIKE '{$sub}%'");

addcslashes () funkcję przed podano odwrotnym ukośnikiem.

Składnia:

addcslashes(string,characters)
parametry opis
sznur Wymagany. Aby sprawdzić czy podany ciąg znaków.
znaków Opcjonalne. Przepisane przez addcslashes () wpływa na znaki lub zakresy znaków.

Można zobaczyć specjalny wniosek: te addcslashes PHP () funkcja