Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]proszę o opinię na temat klasy przeciwdziałającej sql injection
omxd
post
Post #1





Grupa: Zarejestrowani
Postów: 135
Pomógł: 0
Dołączył: 18.05.2010

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
Damonsson
post
Post #2





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Robota głupiego. Stosuj poprawnie PDO i nie będziesz musiał się martwić o SQL Injection.
Go to the top of the page
+Quote Post
omxd
post
Post #3





Grupa: Zarejestrowani
Postów: 135
Pomógł: 0
Dołączył: 18.05.2010

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
!*!
post
Post #4





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


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ś.
Go to the top of the page
+Quote Post
bmL
post
Post #5





Grupa: Zarejestrowani
Postów: 301
Pomógł: 25
Dołączył: 15.07.2007
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
pmir13
post
Post #6





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

Ostrzeżenie: (0%)
-----


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.

Ten post edytował pmir13 4.06.2013, 10:17:08
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 16.09.2025 - 02:32