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

Jaki jest najbezpieczniejszy sposób dodania html/css/js do mysql?

Tak, MySQL może bezpiecznie przechowywać każdy rodzaj tekstu. Co oznacza, że ​​MySQL zapisze tekst w takim stanie, w jakim jest, i zwróci go ponownie bez utraty danych.

Mysql nie różni się zawartością tekstu, więc nie ma znaczenia, czy jest to HTML, CSS, kod JS, czy ostatni e-mail Twoich znajomych.

Jeśli jednak wypiszesz tekst później, powinieneś zadbać o to, aby po pobraniu danych z mysql nie doszło do niechcianego wstrzyknięcia kodu. Ale w rzeczywistości nie jest to związane z MySQL.

Aby zwiększyć bezpieczeństwo sql, przekaż uchwyt bazy danych do mysql_real_escape_string lub jeszcze lepiej użyj MySQLi i/lub PDO i przygotowanych oświadczeń.

Twój kod

Twój kod wygląda tak, jakbyś bardzo się starał, aby coś zapobiec, ale w końcu okazuje się całkiem bezużyteczny:

Filtr funkcji
function filter($data) {
$data = trim(htmlentities(strip_tags($data)));

if (get_magic_quotes_gpc())
    $data = stripslashes($data);
    $data= strip_tags($data);

$data = mysql_real_escape_string($data);

return $data;}

Znormalizuj dane przed ich przetworzeniem

Przede wszystkim należy zmienić pozycję czeku dla get_magic_quotes_gpc aby znormalizować dane, na których działa funkcja. Byłoby jeszcze lepiej, gdyby twoja aplikacja nie polegała na tym, ale po prostu odmawia pracy, jeśli ta opcja jest włączona - zobacz te ważne informacje na ten temat jeśli zależy Ci na bezpieczeństwie.

Ale dla bezpieczeństwa opublikowanego kodu, najpierw znormalizujmy wartość wejściową funkcji przed dalszym jej przetwarzaniem. Odbywa się to poprzez przeniesienie wyboru na górę funkcji.

function filter($data)
{
   // normalize $data because of get_magic_quotes_gpc
   $dataNeedsStripSlashes = get_magic_quotes_gpc();
   if ($dataNeedsStripSlashes)
   {
     $data = stripslashes($data);
   }

   // normalize $data because of whitespace on beginning and end
   $data = trim($data);

   // strip tags
   $data = strip_tags($data);

   // replace characters with their HTML entitites
   $data = htmlentities($data);

   // mysql escape string    
   $data = mysql_real_escape_string($data);

   return $data;
 }

W tej zmodyfikowanej funkcji elementy magicznego cudzysłowu (których nie powinieneś używać) zostały przeniesione na górę. Gwarantuje to, że niezależnie od tego, czy ta opcja jest włączona, czy wyłączona, dane będą zawsze przetwarzane tak samo. Twoja funkcja tego nie zrobiła, utworzyłaby różne wyniki dla tych samych przekazanych danych. Więc to zostało naprawione.

Więcej problemów z Twoją funkcją

Nawet funkcja wygląda teraz lepiej, nadal ma wiele problemów. Na przykład nie jest jasne, co faktycznie robi funkcja. Robi wiele rzeczy na raz, a niektóre z nich są sprzeczne:

  • Usuwa znaczniki HTML, które są znakiem, że $data nie powinien zawierać HTML
  • Ale potem konwertujesz tekst $data aby faktycznie zawierały encje HTML.

Więc jakie powinny być dane? HTML czy nie? Nie wprowadza większego bezpieczeństwa, jeśli sprawy staną się niejasne, ponieważ będzie to korzystne, jeśli w programie pojawią się błędy, a na koniec nawet przejdą środki ostrożności.

Po prostu wyrzuć kod i rozważ następujące kwestie:

  • Jeśli dane wprowadzone do aplikacji są nieprawidłowe, nie filtruj ich. Zamiast tego zapobiegaj dalszemu używaniu nieprawidłowych danych wejściowych. Potrzebujesz więc funkcji do sprawdzania poprawności danych wejściowych, zanim z niej skorzystasz.
  • Nie zmieniaj danych tylko dlatego, że myślisz może to uczynić coś bardziej bezpiecznego. Zamiast tego zmień i zakoduj dane tam, gdzie jest to potrzebne i właściwe.
    • Spraw, aby Twoja aplikacja działała tylko z wyłączonymi magicznymi cudzysłowami. Poleganie na tej funkcji jest wysoce odradzane. A potem nie ma potrzeby sprawdzania tego w całym kodzie.
    • Aby bezpiecznie przechowywać coś w bazie danych, unikaj danych przed użyciem ich tylko w zapytaniu. Nie w innym miejscu Twojej aplikacji. Użyj do tego przygotowanych oświadczeń.
    • Nie ma potrzeby przetrząsania danych przed umieszczeniem ich w bazie danych, jeśli są prawidłowe. Ale musisz poprawnie zakodować go, gdy wyślesz go na stronę internetową . I tylko tam aplikacja wie, w jakim kodowaniu to musi być. Nie wiesz tego, kiedy umieszczasz dane w bazie danych.

Więc jeśli chcesz, aby twój kod był bezpieczniejszy, nie chodzi o wrzucanie wielu funkcji do niektórych danych, ponieważ uważasz, że są one związane z bezpieczeństwem. W ten sposób nie czynisz swojego oprogramowania bezpieczniejszym, ale mniej bezpiecznym.

  1. Nigdy nie ufaj danym użytkownika.
  2. Upewnij się, że dane są w formacie, którego potrzebujesz przed przetworzeniem .
  3. Użyj odpowiedniego narzędzia do pracy we właściwym miejscu.
  4. Nigdy nie używaj narzędzi do zgadywania. Zamiast tego zdobądź wiedzę, która opłaca się nie tylko pod względem bezpieczeństwa.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Używanie PHPExcel do tworzenia automatycznie generowanych plików Excel

  2. Najlepszy sposób na obsługę dużego (UUID) jako klucza podstawowego tabeli MySQL

  3. Czy można utworzyć kolumnę z domyślną wartością UNIX_TIMESTAMP w MySQL?

  4. Wyszukiwarka podobna do Google w PHP/mySQL

  5. Jak wstawiać rekordy z tabeli do innej bez duplikatów