Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: dwie funkcje dot. bezpieczenstwa wprowadzania danych za pomoca SQL
Forum PHP.pl > Forum > Bazy danych > MySQL
deniol13
  1. <!--quoteo--><div class='quotetop'>Cytat</div><div class='quotemain'><!--quotec-->/*
  2. * Funkcja sprawdza czy $data jest typu $expected_data_type (int, string) i zwraca true lub false jezeli $data nie jest poprawna
  3. * do uzycia w zapytaniu SQL
  4. * $secure_level = 0, nie zwraca uwagi na wystepowanie SELECT, UNION, *, dla $secure_level = 1, zwraca uwage na wystepowanie skladni SQL
  5. */
  6. function is_safe_data( $data, $expected_data_type = 'int', $secure_level = 0 )
  7. {
  8. if( $expected_data_type == 'int' )
  9. {
  10. if( is_numeric( $data ) )
  11. {
  12. return 1;
  13. }
  14. else
  15. {
  16. return 0;
  17. }
  18. }
  19. elseif( $expected_data_type == 'string' )
  20. {
  21. if( $secure_level == 1 )
  22. {
  23. preg_match( '/(SELECT|UNION|\*|DROP TABLE|UPDATE |,)/si', $data, $preg );
  24. if( $preg )
  25. {
  26. return 0;
  27. }
  28. else
  29. {
  30. return 1;
  31. }
  32. }
  33. }
  34. }
  35.  
  36. /*
  37. * Funkcja z $data usuwa skladnie SQL
  38. */
  39. function convert_to_safe_data( $data )
  40. {
  41. $data = strtolower( $data );
  42.  
  43. $hex_translate = array(
  44. '%43' => 'C',
  45. '%45' => 'E',
  46. '%49' => 'I',
  47. '%4c' => 'L',
  48. '%4e' => 'N',
  49. '%4f' => 'O',
  50. '%53' => 'S',
  51. '%54' => 'T',
  52. '%55' => 'U',
  53. '%63' => 'c',
  54. '%65' => 'e',
  55. '%69' => 'i',
  56. '%6c' => 'l',
  57. '%6e' => 'n',
  58. '%6f' => 'o',
  59. '%73' => 's',
  60. '%74' => 't',
  61. '%75' => 'u',
  62. '%58' => 'X',
  63. '%78' => 'x',
  64. '%2a' => '*',
  65. '%2f' => '/');
  66.  
  67. foreach( $hex_translate AS $hex => $char )
  68. {
  69. $data = str_replace( $hex, $char, $data );
  70. }
  71.  
  72. $data = str_replace( '*', '', $data );
  73.  
  74. $data = str_replace( '/', '', $data );
  75.  
  76. $data = preg_replace( '/(select|SELECT|UNION|union|EXEC|exec)/si', '', $data );
  77.  
  78. return $data;
  79. }<!--QuoteEnd--></div><!--QuoteEEnd-->
  80.  
  81. prosil bym o ocene, i czy to zmniejszy szanse ataku sql injection?
  82. Funkcja druga to sie wzorowalem na tym
  83. <!--c1--><div class='codetop'>Kod</div><div class='codemain'><!--ec1-->http://axelpl.wordpress.com/2008/01/01/uniwersalne-zabezpieczenie-przed-sql-injection-i-xss/<!--c2--></div><!--ec2-->


zmniejszy to szanse ataku sql inj jesli bede stosowac te funkcje?
Mchl
Mam dla Ciebie lepszą funkcję:
mysql_real_escape_string() <- dla stringów

Rzutowanie na int <- dla integerów
Rzutowanie na float <- dla zmiennoprzecinkowych.

Nie wzoruj się więcej na tamtym blogu. Facet nie ma pojęcia o czym pisze.
darko
~deniol13 jeśli chcesz wyeliminować zagrożenie spowodowane atakami sql injection poczytaj o PDO.
Mchl
A w jaki sposób PDO eliminuje to zagrożenie?
darko
Cytat(Mchl @ 4.07.2010, 10:43:00 ) *
A w jaki sposób PDO eliminuje to zagrożenie?


Cytat
Calling PDO::prepare() and PDOStatement::execute() for statements that will be issued multiple times with different parameter values optimizes the performance of your application by allowing the driver to negotiate client and/or server side caching of the query plan and meta information, and helps to prevent SQL injection attacks by eliminating the need to manually quote the parameters.


Poprzez poprawne preparowanie składni zapytań sql (prepare) i bindowanie parametrów (bindParam lub bindValue) możemyt praktycznie unimożliwić modyfikację zapytania kierowanego do bazy danych przez dane wejściowe. Nie musimy też korzystać z funkcji eskejpujących itp. Oczywiście nikt nie każe używać PDO, jednak jest to już od jakiegoś czasu standard. Co do bezpieczeństwa, to warto wspomnieć, że każdy źle napisany skrypt, w którym nie przewidziano różnych sytuacji może być podatny na ataki tego typu.
Mchl
O to mi chodziło. Nie PDO samo w sobie w magiczny sposób eliminuje to niebezpieczeństwo, tylko poprawne korzystanie z zapytań przygotowanych. Z tych z kolei można korzystać oczywiście w PDO, ale też i w ext/mysql (chociaż niezbyt wygodnie) jak i w ext/mysqli.

Czy PDO jest takim standardem... pewnie zależy gdzie i do czego.
darko
Cytat(Mchl @ 4.07.2010, 11:26:11 ) *
O to mi chodziło. Nie PDO samo w sobie w magiczny sposób eliminuje to niebezpieczeństwo, tylko poprawne korzystanie z zapytań przygotowanych. Z tych z kolei można korzystać oczywiście w PDO, ale też i w ext/mysql (chociaż niezbyt wygodnie) jak i w ext/mysqli.

Czy PDO jest takim standardem... pewnie zależy gdzie i do czego.

~Mchl nigdzie nie napisałem, że PDO samo z siebie eliminuje zagrożenie, chciałem tylko zainteresować autora tematu możliwością wyeliminowania zagrożeń sql injection poprzez naukę poprawnego korzystania z PDO smile.gif Pozdrawiam.
Mchl
Taką lakoniczną wypowiedź można na wiele sposobów odczytać winksmiley.jpg

Pozdr.
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.