Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Niedozwolone znaki
Forum PHP.pl > Forum > PHP
unw
Witam. mam pewien problem.

Posiadam formularz, który zapisuje wyniki do bazy danych. Problem pojawia się gdy są dodawane znaki specjalne typu: & ( ) < > itd.

chciałbym zabezpieczyć mój skrypt przed atakami.

Mam zrobione tak:


  1. $slowo=$_POST['slowo'];
  2.  
  3. $slowoz = strip_tags($slowo);
  4. ///$slowoz = mysql_real_escape_string($_POST['slowo']);
  5.  
  6. $ogonki = array("ę", "ó", "ą", "ś", "ł", "ż", "ź", "ć", "ń", "Ę", "Ó", "Ą", "Ś", "Ł", "Ż", "Ź", "Ć", "Ń", " ", "?");
  7. $bez_ogonkow = array("e", "o", "a", "s", "l", "z", "z", "c", "n", "E", "O", "A", "S", "L", "Z", "Z", "C", "N", "-","");
  8.  
  9. $nazwa_nopolish=str_replace($ogonki, $bez_ogonkow, $slowoz);
  10.  
  11. $nopolish_small = strtolower($nazwa_nopolish); //zmiana na małe litery
  12.  
  13. $zapytanie="SELECT * FROM `$baza` WHERE `tagi` = '$slowoz'" or die(mysql_error());
  14.  
  15. $wynikkoncowy = mysql_query($zapytanie);


w jaki sposób kontrolować niedozwolone znaki?
Chodzi o to, gdy ktoś wpisze: treść #(*@)#

to nie doda tego do bazy tylko odrzuci

jak to zrobic?
Pyton_000
Ale ma Ci to odrzucić w sensie ma nie dodać tych znaków do bazy, czy ma dodać ale bezpiecznie, czy co?
unw
ma nie dodawać znaków specjalnych - jeżeli będzie przykładowo ala ma kota #(&*#*(&@!)_!) itd to usuwa znaki specjalne i dodaje ala ma kota samo, a jeżeli ktoś wpisze same znaki specjalne to ma odrzucić.

A może tak od początku.

Napisałem ala wyszukiwarkę tagów.

  1. <?php
  2. $_POST['slowo']=trim($_POST['slowo']);
  3.  
  4.  
  5. if(empty($_POST['slowo']))
  6.  
  7.  
  8. // funkcja sprawdza długość znaków i minimum.
  9. if (strlen($_POST['slowo']) < 4 or strlen($_POST['slowo']) > 25)
  10. {
  11. echo "Wyszukiwane słowo musi mieć minimum 4 znaki oraz maxymalnie 25 znaków.";
  12. return $_POST['slowo'];
  13. } // koniec
  14.  
  15. if(empty($_POST['slowo']))
  16.  
  17. echo 'Wpisz co chcesz szukać!';
  18. // jeśli jednak dane są wpisane poprawnie
  19. else
  20. {
  21. require ('db.php'); // wstawiamy dane configuracyjne do polaczenia z baza
  22. $slowo = mysql_real_escape_string(htmlspecialchars($_POST['slowo'])); //// tutaj filtruje dane
  23.  
  24. //////////
  25. //$slowo=$_POST['slowo'];
  26.  
  27. $slowoz = strip_tags($slowo);
  28. ///$slowoz = mysql_real_escape_string($_POST['slowo']);
  29.  
  30.  
  31.  
  32. $ogonki = array("ę", "ó", "ą", "ś", "ł", "ż", "ź", "ć", "ń", "Ę", "Ó", "Ą", "Ś", "Ł", "Ż", "Ź", "Ć", "Ń", " ", "?");
  33. $bez_ogonkow = array("e", "o", "a", "s", "l", "z", "z", "c", "n", "E", "O", "A", "S", "L", "Z", "Z", "C", "N", "-","");
  34.  
  35. $nazwa_nopolish=str_replace($ogonki, $bez_ogonkow, $slowoz);
  36.  
  37. $nopolish_small = strtolower($nazwa_nopolish); //zmiana na małe litery
  38.  
  39. $zapytanie="SELECT * FROM `$baza` WHERE `tagi` = '$slowoz'" or die(mysql_error());
  40.  
  41. $wynikkoncowy = mysql_query($zapytanie);
  42.  
  43. if(mysql_num_rows($wynikkoncowy)==0) // jezeli nie istnieje to dodajemy:
  44.  
  45. {// tutaj dodajemy jezeli nie ma w bazie:
  46.  
  47. $dodaje = "INSERT INTO $baza (tagi) VALUES ('$slowoz')" or die(mysql_error());
  48.  
  49. $wynik = mysql_query($dodaje);
  50.  
  51. }



problem pojawia się gdy np wpisuję w wyszukiwarce <script> to skrypt zaczyna szaleć. Tak samo dodają się znaki html typu
  1. <a href="http://">dddd</a>


Po prostu nie filtruje danych - co zrobić aby właśnie to zadziałało? gdzie błąd zrobiłem ?

Wiem, że w kodzie mam masło maślane, ale to moje początki w php.
com
PHP >= 5.6
  1. $usun = function($data) {
  2. return strtolower(preg_replace('/[^A-Za-z0-9\-]/', '', $data));
  3. }

PHP < 5.6
  1. function usun($data) {
  2. return strtolower(preg_replace('/[^A-Za-z0-9\-]/', '', $data));
  3. }
unw
edit:

usuwa polskie znaki i np. piękne dodaje mi do bazy pikne - gubi ę
com
teoretycznie tak, ciężko powiedzieć bo to jakiś zlepek tych kodów i chyba tam czegoś brakuje, a jak nie to te warunki trochę są bez sensowne, polecałby jednak mysqli i filtrowanie po typach zawsze bezpieczniej wink.gif

no bo to nie zastępuje
  1. $ogonki = array("ę", "ó", "ą", "ś", "ł", "ż", "ź", "ć", "ń", "Ę", "Ó", "Ą", "Ś", "Ł", "Ż", "Ź", "Ć", "Ń", " ", "?");
  2. $bez_ogonkow = array("e", "o", "a", "s", "l", "z", "z", "c", "n", "E", "O", "A", "S", "L", "Z", "Z", "C", "N", "-","");
  3.  
  4. $nazwa_nopolish=str_replace($ogonki, $bez_ogonkow, $slowoz);


najpierw zamieniaj na alfabet bez encji a potem wykonaj usun smile.gif
unw
Dzięki.

Pomogło uporządkowanie całego kodu oraz wywalenie zbędnych śmieci - teraz filtruje i nie przepuszcza do bazy niechcianych zapytań z sql injection włącznie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.