Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Nietypowa walidacja
Forum PHP.pl > Forum > PHP
lukaskolista
Witam. Musze do bazy danych zapisac teksty uzytkownikow z tinymce editora. Musze to jednak zrobic w czystej postaci: nie moge przepuscic tekstu przez htmlspecialchars)= i zapisac do bazy, a nastepnie przy wyswietlaniu uzyc htmlspecialchars_decode(). Musze zapisac je ze znakami specjalnymi. W tym wlasnie problem. W takim przypadku edytor tekstowy staje sie okienkiem do wpisywania polecen dla hakerow. Macie moze pomysl, jak rozwiazac ten problem? Z gory dziekuje za pomoc:)
piotr94
dlaczego nie możesz przepuścić przez te funkcje i przy wyświetlaniu dekodować?
a addslashes i stripslashes questionmark.gif
i zmień tytuł tematu, bo to z tego co wiem nie jest validacja pola formularza biggrin.gif tylko ochrona przed SQL injection
lukaskolista
jakbym mogl to bym nie pisal tematu tongue.gif W bazie musza byc znaki specjalne, to nie jest wyswietlane u mnie. Takie sa wymagania i nic nie moge na to poradzic.
piotr94
a filtrowanie słów "kluczowych" dla zapytań SQL typu OR, AND itp. i odpowiednia zamiana ich na kody &xxx; questionmark.gif
powinno zatrzymać hakerów, bo do bazy nie pójdzie wtedy na pewno nic co by mogło zmienić zapytanie
moim zdaniem i tak to ewidentny błąd osoby u której to się będzie wyświetlać, ale skoro masz takie obligacje to postaram się jakoś pomóc
lukaskolista
Doklanie to co jest w bazie jest przetwarzane przez inny skrypt. Skrypt dziala lokalnie i dostep do niego maja tylko upowaznione osoby, wiec nie potrzebowali tak tego zabezpieczac. Nie ja projektowalem tamta aplikacje biggrin.gif jest jakas funkcja filtrujaca frazy sql i php ?
piotr94
fraz php nie musisz filtorwać, chyba, że gdzieś jest eval(); biggrin.gif
co do fraz SQL to bym to załatwił tak:
  1. $tekst_z_tinymce=preg_replace(array('/ OR /','/ Or /','/ oR /','/ or /'),array( ' OR ',' Or ',' oR ',' or '),$tekst_z_tinymce);
i podobnie AND,... nie musisz filtrować wszystkich słów kluczowych SQL - przeanalizuj które w Twoim zapytaniu moga stwarzać niebezpieczeństwo i filtruj tylko je
//EDIT w drugim array(); powinny być znaczniki &# xxx ;, ale nie wiem czemu forum zamienia te znaczki na litery
lukaskolista
dzieki:) sprobuje

Tak sie zastanawiam, czy nie ma innej mozliwosci. Ta jest dosc problematyczna i malo wydajna. Moze ktos zna inny sposob?
Fifi209
Cytat(piotr94 @ 22.07.2010, 09:39:02 ) *
fraz php nie musisz filtorwać, chyba, że gdzieś jest eval(); biggrin.gif
co do fraz SQL to bym to załatwił tak:
  1. $tekst_z_tinymce=preg_replace(array('/ OR /','/ Or /','/ oR /','/ or /'),array( ' OR ',' Or ',' oR ',' or '),$tekst_z_tinymce);
i podobnie AND,... nie musisz filtrować wszystkich słów kluczowych SQL - przeanalizuj które w Twoim zapytaniu moga stwarzać niebezpieczeństwo i filtruj tylko je
//EDIT w drugim array(); powinny być znaczniki &# xxx ;, ale nie wiem czemu forum zamienia te znaczki na litery

Takie zabezpieczenie nie jest najlepsze, o ile pamiętam wystarczy zabawa z komentarzami.

Co do zabezpieczeń polecam videoarty Unknow'a.
Pilsener
Nie chcę być złośliwy, ale wystarczy zastąpić or || a and &&. A prawdziwe pole do popisu daje tu JS, ja bym sobie darował zabezpieczanie tego bo ilość fraz, które mogą spowodować szkodę jest nieograniczona a w dodatku zaraz ktoś się przyczepi, że wpisując np. "Comercial union" wycina mu union guitar.gif

Robisz tak, jak klient chce, ostrzegasz go i się nie martwisz o nic, jak klient straci wystarczająca ilość czasu i kasy to w końcu zrozumie, że jego koncepcja była zła. Inaczej trudno co niektórych przekonać.
fander
Nie wiem dlaczego podchodzicie do tego w taki sposób że chłopak sam ma tworzyć zapytania, nie lepiej zaproponować koledze przejście na programowanie obiektowe, na początek klasy modeli w połączeniu z prostym PDO. PDO posiada lepsze "zabezpieczenia" przed sql injection niż ty sam jesteś w stanie wymyślić.
Rozwiąż to w ten sposób że tworzysz sobie klasę odpowiadającej tabelce w bazie z odopowiednimi metodami i atrybutami czyli:

  1. class mojaTableka{
  2. /**
  3.  $var PDO
  4.  */
  5. public static $_connection;
  6. public static $_insertSql = 'INSERT INTO mojaTabela (kolumna1,kolumna2,...) VALUES (:kolumna1,:kolumna2,...)';
  7. .
  8. .
  9. .
  10. public $kolumna1;
  11. public $kolumna2;
  12. public $kolumna2;
  13. .
  14. .
  15. .
  16.  
  17. public static parms = array(
  18. 'kolumna1' => PDO::PARAM_STR,
  19. .
  20. .
  21. .
  22. );
  23.  
  24. public function __set($key,$val){
  25. if(isset($this->$key)){
  26. $this->$key = $value;
  27. }
  28. }
  29.  
  30. public function __get($key){
  31. if(isset($this->$key)){
  32. return $this->$key;
  33. }
  34. }
  35.  
  36. public static function insert(mojaTableka $obiekt){
  37. try{
  38. $prep = self::$_connection->prepare(self::$_insertSql);
  39. foreatch(self::$params as $key => $val){
  40. $prep->bondParam(':'.$key,$obiekt->$key,$val);
  41. }
  42. return $prep->execute();
  43. }catch(Exception $e){
  44. return false;
  45. }
  46. }
  47.  
  48. public static function update(mojaTabelka $obiekt){
  49.  
  50. }
  51.  
  52. public static function dell(mojaTableka $obiekt){
  53.  
  54. }
  55.  
  56. public static function get($where){
  57.  
  58. }
  59.  
  60. public function save(){
  61. if($this->IDENTYFIKATOR !== NULL){
  62. mojaTablela::update($this);
  63. }
  64. else{
  65. mojaTablela::insert($this);
  66. }
  67. }
  68.  
  69.  
  70. }


Pisane z ręki mogą być błędy, ale zamysł jest prawidłowy. Jeśli wybierzesz moje rozwiązanie na pewno postaram się pomóc.
cojack
addslashes ma błąd i jest sposób na to by go obejść, dlatego się go nie stosuje.

Nic się nie przejmuj jakie dane są ładowane przez tinymce, wyłącz w nim obsługę js i on się sam ogarnie że nie może być w nim kodu js. A dane ładuj do db poprzez mysql_escape_string i tyle Cie interesuje. Albo PDO jak kolega wyżej napisał.
piotr94
bardzo ciekawe te poradniki Nieznanego biggrin.gif
dzięki za linka
MacDada
Poczytaj do bindValue() w PDO:
http://pl.wikibooks.org/wiki/PHP/Biblioteka_PDO#Podpinanie

W ten sposób nie musisz się martwić, że ktoś Ci zrobi SQL-Injection, choć oczywiście inne ataki typu XSS są możliwe.
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.