Tags: MySQL

MySQL i PHP: SQL injection który obejdzie mysql_real_escape_string()?

Rozumienie SQL Injection i mysql_real_escape_string()

SQL injection to technika, w której atakujący wstrzykuje złośliwy kod SQL do aplikacji, zmieniając jej zachowanie lub dostęp do danych. Funkcja `mysql_real_escape_string()` w PHP służy do unikania SQL injection przez ekranowanie specjalnych znaków w ciągach używanych w zapytaniach SQL.

Ograniczenia mysql_real_escape_string()

Chociaż `mysql_real_escape_string()` jest użyteczna, ma swoje ograniczenia. W szczególności, nie jest w pełni skuteczna, gdy: - Charakterystyka zestawu znaków połączenia nie jest poprawnie ustawiona, co może prowadzić do błędów w ekranowaniu. - Atakujący wykorzystuje skomplikowane metody, takie jak manipulowanie zapytaniami SQL za pomocą kontrolowanych danych w innych częściach zapytania.

Przykład Potencjalnego Ataku

Załóżmy, że mamy następujący kod PHP z wykorzystaniem `mysql_real_escape_string()`:

$query = "SELECT * FROM users WHERE username = '" . mysql_real_escape_string($username) . "'";

W idealnych warunkach, `mysql_real_escape_string()` powinna zapobiec większości prób SQL injection. Jednakże, w niektórych przypadkach, takich jak niepoprawne ustawienie zestawu znaków, mogą wystąpić luki.

Zalecane Rozwiązania

Zaleca się stosowanie nowocześniejszych metod zapobiegania SQL injection, takich jak: - Użycie przygotowanych zapytań (Prepared Statements): Jest to obecnie standardowe rozwiązanie zapobiegające SQL injection. Przygotowane zapytania oddzielają dane od kodu SQL, co sprawia, że ataki SQL injection są niemożliwe.

$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
  $stmt->execute(['username' => $username]);
  • Używanie nowszych rozszerzeń baz danych: Takich jak PDO (PHP Data Objects) lub MySQLi, które wspierają przygotowane zapytania.
  • **Dokładna walidacja danych wejściowych**: Upewnienie się, że dane wejściowe są dokładnie sprawdzane pod kątem poprawności i bezpieczeństwa.

Pamiętaj, że zapobieganie SQL injection to proces ciągły i wymaga uważnego projektowania i implementacji aplikacji.