Katalog artykułów
MySQLJak zapobiec wstrzykiwaniu sql? Zasada i zapobieganie wstrzykiwaniu SQL
MySQL i wstrzyknięcie SQL
Jeśli weźmiesz dane wprowadzone przez użytkownika za pośrednictwem strony internetowej i wstawisz je doBaza danych MySQL, mogą wystąpić problemy z bezpieczeństwem iniekcji SQL.
W tym rozdziale dowiesz się, jak zapobiegać wstrzykiwaniu SQL i używać skryptów do filtrowania wstrzykiwanych znaków w SQL.
Tak zwane wstrzykiwanie SQL polega na oszukaniu serwera w celu wykonania złośliwych poleceń SQL poprzez wstawienie poleceń SQL do formularza internetowego w celu przesłania lub wprowadzenia ciągu zapytania dotyczącego nazwy domeny lub żądania strony.
Nigdy nie powinniśmy ufać danym wprowadzanym przez użytkownika, musimy zakładać, że dane wejściowe użytkownika są niebezpieczne i wszyscy musimy filtrować dane wejściowe użytkownika.
W poniższym przykładzie wprowadzona nazwa użytkownika musi być kombinacją liter, cyfr i podkreśleń, a nazwa użytkownika musi mieć od 8 do 20 znaków:
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) { $result = mysqli_query($conn, "SELECT * FROM users WHERE username=$matches[0]"); } else { echo "username 输入异常"; }
Przyjrzyjmy się sytuacji SQL, która występuje, gdy znaki specjalne nie są filtrowane:
// 设定$name 中插入了我们不需要的SQL语句 $name = "Qadir'; DELETE FROM users;"; mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");
W powyższej instrukcji injection nie filtrowaliśmy zmiennej $name, w $name wstawiamy instrukcję SQL, której nie potrzebujemy, co spowoduje usunięcie wszystkich danych z tabeli users.
mysqli_query() w PHP nie może wykonywać wielu instrukcji SQL, ale SQLite i PostgreSQL mogą wykonywać wiele instrukcji SQL jednocześnie, więc musimy ściśle weryfikować dane tych użytkowników.
Aby zapobiec wstrzyknięciu SQL, musimy zwrócić uwagę na następujące punkty:
- 1. Nigdy nie ufaj wpisom użytkowników.Sprawdź dane wejściowe użytkownika, możesz użyć wyrażeń regularnych lub ograniczyć długość; konwertuj pojedyncze cudzysłowy i podwójne „-” itp.
- 2. Nigdy nie używaj dynamicznego zestawu sql, możesz użyć sparametryzowanego sql lub bezpośrednio użyć procedur składowanych do zapytań i dostępu do danych.
- 3. Nigdy nie używaj połączeń z bazą danych z uprawnieniami administratora, używaj oddzielnych połączeń z bazą danych z ograniczonymi uprawnieniami dla każdej aplikacji.
- 4. Nie przechowuj bezpośrednio poufnych informacji, nie szyfruj ani nie mieszaj haseł i poufnych informacji.
- 5. Informacje o wyjątku aplikacji powinny zawierać jak najmniej wskazówek, a najlepiej jest użyć niestandardowych informacji o błędzie, aby zawinąć oryginalne informacje o błędzie
- 6. Metoda wykrywania iniekcji sql na ogół przyjmuje pomoc;OprogramowanieLub platforma witryny do wykrycia, oprogramowanie zazwyczaj wykorzystuje narzędzie do wykrywania wstrzyknięć sql jsky, platforma witryny ma narzędzie do wykrywania platformy bezpieczeństwa witryny Yisi. MDCSOFT SCAN i in.Korzystanie z MDCSOFT-IPS może skutecznie bronić się przed wstrzyknięciem SQL, atakami XSS itp.
Zapobiegaj wstrzykiwaniu SQL
W językach skryptowych, takich jak Perl i PHP, można uciec przed danymi wprowadzonymi przez użytkownika, aby zapobiec wstrzyknięciu SQL.
Rozszerzenie MySQL dla PHP udostępnia funkcję mysqli_real_escape_string() do zmiany specjalnych znaków wejściowych.
if (get_magic_quotes_gpc()) { $name = stripslashes($name); } $name = mysqli_real_escape_string($conn, $name); mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");
Wstrzyknięcie w podobnych oświadczeniach
Podczas zapytania na przykład, jeśli użytkownik wprowadzi wartości z „_” i „%”, stanie się tak: użytkownik pierwotnie chciał zapytać „abcd_”, ale wyniki zapytania obejmują „abcd_”, „abcde” i „abcdf " Itd.; problem występuje również, gdy użytkownik chce zapytać "30%" (uwaga: trzydzieści procent).
W skrypcie PHP możemy użyć funkcji addcslashes() do obsługi powyższej sytuacji, jak w poniższym przykładzie:
$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_"); // $sub == \%something\_ mysqli_query($conn, "SELECT * FROM messages WHERE subject LIKE '{$sub}%'");
Funkcja addcslashes() dodaje ukośnik odwrotny przed podanym znakiem.
Format składni:
addcslashes(string,characters)
参数 | opis |
---|---|
ciąg | Wymagany.Określa ciąg do sprawdzenia. |
znaków | Opcjonalny.Określa znak lub zakres znaków, na które ma wpływ addcslashes(). |
Nadzieja Chen Weiliang Blog ( https://www.chenweiliang.com/ ) udostępniono „Jak MySQL zapobiega wstrzykiwaniu sql? zasada wtrysku sql i zapobieganie”, to ci pomoże.
Zapraszamy do udostępnienia linku do tego artykułu:https://www.chenweiliang.com/cwl-500.html
Witamy na kanale Telegram bloga Chen Weiliang, aby uzyskać najnowsze aktualizacje!
📚 Ten przewodnik zawiera ogromną wartość, 🌟To rzadka okazja, nie przegap jej! ⏰⌛💨
Udostępnij i polub, jeśli chcesz!
Twoje udostępnianie i polubienia to nasza ciągła motywacja!