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

Atak polegający na wstrzyknięciu, który kończy się pomyślnie mysql_query, ale kończy się niepowodzeniem z mysqli_query

Zostałem przekonany, że:

$selection = mysql_query($dblink, "SELECT * FROM table WHERE name='$idValue' ");

można łatwo naruszyć wartościami $idValue które zamykają ' a następnie dodaj dodatkowe polecenia, takie jak

$idValue = "z'; DELETE * FROM table WHERE name IS NOT NULL";

Chociaż zdaję sobie sprawę, że twierdzisz, że wiele instrukcji jest wyłączonych, czymś, co nie jest tak przerażające, byłoby zwrócenie nieautoryzowanych danych zamiast bezpośredniego edytowania danych w tabeli, na przykład:

  $idValue = "z' OR name IS NOT NULL OR name = 'x";

Podczas gdy w MySQLi istnieje możliwość że podejście to może być używane z prepared statements , co uniemożliwiłoby zmiennej działanie poza swoim statusem jako zwykłą zmienną. Na przykład:

mysqli->prepare("SELECT * FROM tables WHERE name = ? LIMIT 1");
mysqli->bind_param("s",$idValue);
mysqli->execute();

Moje rozumienie bind_param jest to, że zmienna miałaby uniknięcie wszystkich słów kluczowych MySQL i kluczowych znaków, zapobiegając w ten sposób naruszeniu bezpieczeństwa i zwracaniu nieautoryzowanych wierszy.

To jest wybór, którego MySQL nie ma . Przygotowane oświadczenia pomagają w ulepszaniu zabezpieczenia wtrysku, ale nie zapobiegają samych ataków wstrzykiwania, ale programista powinien wykorzystywać więcej w ramach szerszej strategii.

Tak jak noszenie kamizelek kuloodpornych nie sprawi, że staniesz się niepokonany, ale znacznie zwiększy twoje szanse na przeżycie. MySQLi nie jest magiczną kulą, podobnie jak PDO, ale poprawi ogólny poziom bezpieczeństwa.

MySQL jest również przestarzały i, jak stwierdził Christopher, nie jest już utrzymywany, oznacza to, że liczba dziur i problemów z nim będzie rosła wraz z dalszym rozwojem innych technologii.

Podsumowanie

Jeśli piszesz MySQLi w taki sam sposób, jak pisałeś instrukcje MySQL, wtedy nie będziesz miał dodatkowej ochrony przed wstrzyknięciami. Jednak MySQLi oferuje Przygotowane zestawienia podejście, które znacząco zwiększa ochronę przed wstrzyknięciem SQL, ale sama zmiana bazowego interfejsu bazy danych nie daje żadnych nieodłącznych korzyści ani ochrony chyba że zdecydujesz się zakodować je w sobie za pomocą przygotowanych instrukcji .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Klucz obcy MySQL InnoDB między różnymi bazami danych

  2. Czy istnieje mysql JDBC, który będzie respektował fetchSize?

  3. Uruchom plik .sql w Pythonie za pomocą MySQLdb

  4. Używanie backquote/backticks dla zapytań mysql

  5. Błąd MySQL podczas wstawiania danych zawierających apostrofy (pojedyncze cudzysłowy)?