Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]proszę o opinię na temat klasy przeciwdziałającej sql injection
Forum PHP.pl > Forum > Przedszkole
omxd
Witam serdecznie,
przeczytałem setki opinii na temat sql injection i wiem ,że nie ma idealnego rozwiązania.Postanowiłem ,że dla pewności usunę wszystkie słowa i znaki które mogą zaszkodzić (użytkownik nie potrzebuje tych znaków).Proszę o wyrażenie opinii i ew.luk chciałbym mieć jako taką pewność ,że nikt mi tego za moment nie rozsypie.Z góry dziękuję.
  1. <?php
  2.  
  3. class Lib_Validation_Sql {
  4.  
  5. public $liste = array('\'', 'declare', 'char', 'set', 'cast', 'convert', 'drop', 'exec', 'meta', 'script', 'select', 'truncate', 'insert', 'delete', 'union', 'update', 'create', 'where', 'join', 'information_schema', 'table_schema', 'into');
  6. private $specialfind = array('"', '-', '*', '=');
  7. private $specialreplace = array('"', '-', '*', '=');
  8.  
  9. public function checkInteger($int) {
  10. if (is_numeric($int)) {
  11. return true;
  12. }
  13. }
  14.  
  15. public function checkString($string) {
  16.  
  17. foreach ($this->liste as $commands) {
  18. $string = str_replace($commands, " ", $string);
  19. }
  20.  
  21. $counted_el = count($this->specialfind);
  22. for ($i = 0; $i <= 10; $i++) {
  23. $string = str_replace($this->specialfind[$i], $this->specialreplace[$i], $string);
  24. }
  25.  
  26. if ((is_string($string)) and (false !== strpos($string, "\\"))) {
  27. $string = str_replace( array("\\"), '', $string);
  28. }
  29. if ((is_string($string)) and (false !== strpos($string, "/"))) {
  30. $string = str_replace( array("/"), '', $string);
  31. }
  32.  
  33. return $string;
  34. }
  35.  
  36. }
  37.  
  38. ?>
Damonsson
Robota głupiego. Stosuj poprawnie PDO i nie będziesz musiał się martwić o SQL Injection.
omxd
używam mysqli i napisanego przeze mnie framework'a - będę miał ogrom pracy przy przebudowie wszystkiego .Nie przemyślałem tego niestety wcześniej.Myślisz ,że to tymczasowo zda egzamin?
!*!
Cytat(omxd @ 4.06.2013, 09:56:31 ) *
używam mysqli i napisanego przeze mnie framework'a - będę miał ogrom pracy przy przebudowie wszystkiego .Nie przemyślałem tego niestety wcześniej.Myślisz ,że to tymczasowo zda egzamin?

A to mysqli nie ma bindowania? Powyższy kod jest bez sensu, jego też nie przemyślałeś.
bmL
mysqli też się nada na zabezpieczenie przed sql injection
http://www.php.net/manual/en/mysqli.quicks...-statements.php
Możesz sobie nawet napisać klasę która będzie dziedziczyła po oryginalnym mysqli i będzie robić coś w stylu
  1. <?php
  2. function query($query, $params) {
  3. $stmt = $this -> connection -> prepare($query);
  4. $stmt -> bind_param(str_repeat('s', count($params)), $params);
  5. return $stmt -> fetch_all();
  6. }

wykorzystanie wyglądało by tak:
  1. <?php
  2. $mysqli -> query('SELECT x,y,z FROM p WHEER x=?,y=?', [$x,$y]);

Dla uwygodnienia sobie życia można by wykorzystać http://php.net/manual/en/function.func-get-args.php

Taka moja luźna propozycja.
pmir13
Tymczasowo egzamin zda, dopóki nie przerobisz całości kodu.
Dlaczego jednak checkString zwraca wyczyszczony string, a checkInteger tylko true/false? I dlaczego ta ostatnia metoda tak się nazywa skoro is_numeric() przepuści na przykład '1.23E-14' ?
Poza tym dość łatwo zakładasz że użytkownik może pewnych znaków nie potrzebować. Gdybym miał przykładowo sklep internetowy to Shaquille O'Neal byłby dla mnie wielce pożądanym klientem.
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.