de-vraag
  • Pytania
  • Tagi
  • Użytkownicy
Powiadomienia
Nagrody
Rejestracja
Po zarejestrowaniu się, będziesz otrzymywać powiadomienia o odpowiedziach i komentarzach do swoich pytań.
Zaloguj się
Brak tłumaczeń pasujących do Twojego wyszukiwania Jeśli masz już konto, zaloguj się, aby sprawdzić nowe powiadomienia.
Za dodane pytania, odpowiedzi i komentarze przewidziane są nagrody.
Więcej
Źródło
Edytuj
Andrew  G. Johnson
Andrew G. Johnson
Question

Jak mogę zapobiec SQL injection w PHP?

Jeśli dane wejściowe użytkownika są wstawiane bez modyfikacji do zapytania SQL, wówczas aplikacja staje się podatna na SQL injection, jak w poniższym przykładzie:

$unsafe_variable = $_POST['user_input']; 

mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");

Dzieje się tak dlatego, że użytkownik może wprowadzić coś w rodzaju value'); DROP TABLE table;--, a zapytanie staje się:

INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')

Co można zrobić, aby temu zapobiec?

2776 2008-09-12T23:55:00+00:00 3
 Ry-
Ry-
Edytowane pytanie 1. października 2016 в 8:08
Programowanie
sql
php
mysql
security
sql-injection
Popular videos
What is SQL Injection ? How to prevent SQL Injection Attack in php/mysql ?
What is SQL Injection ? How to prevent SQL Injection Attack in php/mysql ?
1 rok temu
SQL Injection PHP Example | How to prevent SQL injection in PHP?
SQL Injection PHP Example | How to prevent SQL injection in PHP?
1 rok temu
39: Protect your database against SQL injection using MySQLi | PHP tutorial | Learn PHP programming
39: Protect your database against SQL injection using MySQLi | PHP tutorial | Learn PHP programming
4 lata temu
PHP Security: SQL Injection
PHP Security: SQL Injection
6 lat temu
Avoid SQL injection attacks in PHP using PDO
Avoid SQL injection attacks in PHP using PDO
5 lat temu
SQL Injection - Como proteger seu sistema PHP deste tipo de ataque!
SQL Injection - Como proteger seu sistema PHP deste tipo de ataque!
1 rok temu
PHP Login Page | SQL Injection Prevention | Secured Login
PHP Login Page | SQL Injection Prevention | Secured Login
3 lata temu
Как легко взломать сайт на PHP — SQL injection
Как легко взломать сайт на PHP — SQL injection
4 lata temu
PHP Code Injection through SQL Injection
PHP Code Injection through SQL Injection
4 lata temu
SQL Injection - co to takiego i jak się przed tym chronić.
SQL Injection - co to takiego i jak się przed tym chronić.
2 lata temu
Skutki błędów SQL Injection - wykonanie kodu
Skutki błędów SQL Injection - wykonanie kodu
2 lata temu
Php'de Sql Injection'dan Korunma Kütüphanesi Kullanımı - yorumcu.php
Php'de Sql Injection'dan Korunma Kütüphanesi Kullanımı - yorumcu.php
3 lata temu
Practical video on SQL Injection attack and its prevention in PHP  (Bengali)
Practical video on SQL Injection attack and its prevention in PHP (Bengali)
1 rok temu
SQL Injection - darmowe szkolenie dla początkujących
SQL Injection - darmowe szkolenie dla początkujących
1 rok temu
What is in SQL injection? How can I prevent SQL injection in PHP? Prevent SQL Injection Attacks
What is in SQL injection? How can I prevent SQL injection in PHP? Prevent SQL Injection Attacks
7 miesięcy temu
43-How to Prevent SQL injection with PHP in Hindi
43-How to Prevent SQL injection with PHP in Hindi
3 lata temu
PHP Programming 17 - Insert Data into Database by Avoiding SQL Injection - Sinhala
PHP Programming 17 - Insert Data into Database by Avoiding SQL Injection - Sinhala
1 rok temu
PHP Security - SQL Injection Example and Prevention
PHP Security - SQL Injection Example and Prevention
5 lat temu
« Poprzedni
Następny »
To pytanie ma 1 odpowiedź w języku angielskim, aby je przeczytać zaloguj się na swoje konto.
Matt Sheppard
Matt Sheppard
13. września 2008 в 9:48
2008-09-13T09:48:48+00:00
Więcej
Źródło
Edytuj
#8454498

Ostrzeżenie o przestarzałej wersji: Przykładowy kod tej odpowiedzi (podobnie jak przykładowy kod pytania) używa rozszerzenia PHP'MySQL`, które zostało wycofane z użycia w PHP 5.5.0 i usunięte całkowicie w PHP 7.0.0.

Ostrzeżenie dotyczące bezpieczeństwa: Ta odpowiedź nie jest zgodna z najlepszymi praktykami bezpieczeństwa. Ucieczka jest niewystarczająca, aby zapobiec SQL injection, zamiast tego używaj prepared statements. Używaj strategii opisanej poniżej na własne ryzyko. (Ponadto, mysql_real_escape_string() został usunięty w PHP 7).

Jeśli używasz nowszej wersji PHP, opcja mysql_real_escape_string nie będzie już dostępna (chociaż mysqli::escape_string jest jej nowoczesnym odpowiednikiem). W dzisiejszych czasach opcja mysql_real_escape_string miałaby sens tylko dla starszych wersji PHP.


Masz dwie opcje - ucieczka od znaków specjalnych w unsafe_variable, lub użycie sparametryzowanego zapytania. Obydwie opcje uchronią Cię przed SQL injection. Zapytanie parametryzowane jest uważane za lepszą praktykę, ale będzie wymagało zmiany na nowsze rozszerzenie MySQL w PHP, zanim będziesz mógł go użyć.

Najpierw zajmiemy się mniejszym wpływem ucieczki od ciągów znaków.

//Connect

$unsafe_variable = $_POST["user-input"];
$safe_variable = mysql_real_escape_string($unsafe_variable);

mysql_query("INSERT INTO table (column) VALUES ('" . $safe_variable . "')");

//Disconnect

Zobacz także szczegóły funkcji mysql_real_escape_string.

Aby użyć sparametryzowanego zapytania, musisz użyć MySQLi zamiast funkcji MySQL. Aby przepisać twój przykład, potrzebowalibyśmy czegoś takiego jak poniżej.

<?php
    $mysqli = new mysqli("server", "username", "password", "database_name");

    // TODO - Check that connection was successful.

    $unsafe_variable = $_POST["user-input"];

    $stmt = $mysqli->prepare("INSERT INTO table (column) VALUES (?)");

    // TODO check that $stmt creation succeeded

    // "s" means the database expects a string
    $stmt->bind_param("s", $unsafe_variable);

    $stmt->execute();

    $stmt->close();

    $mysqli->close();
?>

Kluczową funkcją, o której będziesz chciał poczytać, będzie mysqli::prepare.

Ponadto, jak sugerowali inni, możesz uznać za użyteczne/łatwiejsze przejście na wyższą warstwę abstrakcji z czymś takim jak PDO.

Należy pamiętać, że przypadek, o który pytałeś, jest dość prosty i że bardziej złożone przypadki mogą wymagać bardziej złożonych podejść. W szczególności:

  • Jeśli chcesz zmienić strukturę SQL na podstawie danych wejściowych użytkownika, sparametryzowane zapytania nie pomogą, a wymagana ucieczka nie jest objęta przez mysql_real_escape_string. W tego typu przypadkach, lepiej jest przepuścić dane wejściowe użytkownika przez białą listę, aby upewnić się, że tylko 'bezpieczne' wartości są przepuszczane.
  • Jeśli użyjesz liczb całkowitych z danych wejściowych użytkownika w warunku i zastosujesz podejście mysql_real_escape_string, będziesz cierpiał z powodu problemu opisanego przez Polynomial w komentarzach poniżej. Ten przypadek jest trudniejszy, ponieważ liczby całkowite nie byłyby otoczone cudzysłowami, więc możesz sobie poradzić, sprawdzając, czy dane wejściowe użytkownika zawierają tylko cyfry.
  • Istnieją prawdopodobnie inne przypadki, których nie jestem świadomy. Możesz znaleźć to jest użytecznym źródłem informacji na temat niektórych z bardziej subtelnych problemów, które możesz napotkać.
Theodore  R. Smith
Theodore R. Smith
Edytowana odpowiedź 9. maja 2019 в 3:02
PHP: MySQLi - Manual
php.net
PHP: PDO - Manual
php.net
Preventing SQL Injection in PHP Applications - the Easy and Definitive Guide - Paragon Initiative Enterprises Blog
It&#039;s 2015; there&#039;s no excuse for writing code vulnerable to SQL Injection any more
paragonie.com
PHP: mysqli::prepare - Manual
php.net
PHP: mysql_real_escape_string - Manual
php.net
PHP: Overview of the MySQL PHP drivers - Manual
php.net
1620
0
 Kibbee
Kibbee
13. września 2008 в 12:02
2008-09-13T00:02:20+00:00
Więcej
Źródło
Edytuj
#8454406

Polecam użycie PDO (PHP Data Objects) do uruchamiania sparametryzowanych zapytań SQL.

Nie tylko chroni to przed SQL injection, ale także przyspiesza wykonywanie zapytań.

A używając PDO zamiast funkcji mysql_, mysqli_ i pgsql_, sprawiasz, że Twoja aplikacja jest nieco bardziej oderwana od bazy danych, w rzadkich przypadkach, gdy musisz zmienić dostawcę bazy danych.

Peter Mortensen
Peter Mortensen
Edytowana odpowiedź 15. lipca 2019 в 12:48
PHP: PDO - Manual
ca3.php.net
834
0
 Tanerax
Tanerax
13. września 2008 в 12:15
2008-09-13T00:15:53+00:00
Więcej
Źródło
Edytuj
#8454431

Możesz zrobić coś podstawowego, jak to:

$safe_variable = mysqli_real_escape_string($_POST["user-input"], $dbConnection);
mysqli_query($dbConnection, "INSERT INTO table (column) VALUES ('" . $safe_variable . "')");

Nie rozwiąże to każdego problemu, ale jest to bardzo dobry krok naprzód. Pominąłem oczywiste rzeczy, takie jak sprawdzanie istnienia zmiennej' format (liczby, litery, itp.).

 Uzair
Uzair
Edytowana odpowiedź 18. czerwca 2019 в 10:23
456
0
Dodaj pytanie
Kategorie
Wszystkie
Technologia
Kultura / Rekreacja
Życie / Sztuka
Nauka
Profesjonalny
Biznes
Użytkownicy
Wszystkie
Nowy
Popularny
1
Jasur Fozilov
Zarejestrowany 10 godzin temu
2
Zuxriddin Muydinov
Zarejestrowany 1 dzień temu
3
Денис Анненский
Zarejestrowany 3 dni temu
4
365
Zarejestrowany 1 tydzień temu
5
True Image
Zarejestrowany 1 tydzień temu
DA
DE
EL
ES
FI
FR
ID
IT
JA
KO
LT
NL
PL
PT
RU
SK
SL
TR
ZH
© de-vraag 2022
Źródło
stackoverflow.com
na podstawie licencji cc by-sa 3.0 z przypisaniem