Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Prosba o sprawdzenie skryptu pod katem SQL Injection
Forum PHP.pl > Forum > Bazy danych
rakoo
Witam, robie serwer pod jedna z gier online.
Po doglebnym analizie kodu zauwazylem ze dane z formularzy z "gotowca stronki" nie sa wogole filtrowane, wiec postanowilem to naprawic.
Moglby ktos mi powiedziec czy wszystko zrobilem dobrze?

Fukncja odbierajace dane z formularza rejestracji i przekazujace ja do bazy danych:

  1. function register()
  2. {
  3. $account = stripslashes($_POST['account']);
  4. $password = stripslashes($_POST['password']);
  5. $repassword = stripslashes($_POST['repassword']);
  6. $email = stripslashes($_POST['email']);
  7. $squestion = stripslashes($_POST['question']);
  8. $sanswer = stripslashes($_POST['answer']);
  9. $verifyinput2 = stripslashes($_POST['verifyinput2']);
  10. $country = stripslashes($_POST['country']);
  11. $gender = stripslashes($_POST['gender']);
  12.  
  13.  
  14. // moje zabezpieczenia
  15.  
  16. $account_check = str_replace("'","''",$account);
  17. $sprawdzenie = ereg("[^0-9a-zA-Z_-]", $account, $str);
  18. if ($account_check!=$account AND $sprawdzenie=1) { echo "<br>Don't try to hack beybe<br>"; $error=1; echo $str[0] ;}
  19.  
  20. $pass_check = str_replace("'","''",$password);
  21. $sprawdzenie = ereg("[^0-9a-zA-Z_-]", $password, $str);
  22. if ($pass_check!=$password AND $sprawdzenie=1) { echo "<br>Don't try to hack beybe<br>"; $error=1; echo $str[0]; }
  23.  
  24. $repass_check = str_replace("'","''",$repassword);
  25. $sprawdzenie = ereg("[^0-9a-zA-Z_-]", $password, $str);
  26. if ($repass_check!=$repassword AND $sprawdzenie=1) { echo "<br>Don't try to hack beybe<br>"; $error=1; echo $str[0] ;}
  27.  
  28. $squestion="yes";
  29. $sanswer = "no";
  30. $gender = "none";
  31. $country = "Earth";
  32.  
  33. $idcode = 00000000;
  34. $email = "not@need.com";
  35. $date = date('m/d/Y');
  36. // koniec zabezpieczen
  37. require("config.php");
  38. include("includes/validate.class.php");
  39.  
  40. $username_check = $db->Execute("SELECT memb___id FROM MEMB_INFO WHERE memb___id=?",array($account));
  41. $username_verify = $username_check->numrows();
  42.  
  43. $email_check = $db->Execute("SELECT mail_addr FROM MEMB_INFO WHERE mail_addr=?",array($email));
  44. $email_verify = $email_check->numrows();
  45.  
  46.  
  47.  
  48. $elems[] = array('name'=>'account','label'=>''.$warning_start.' Account ID Is Invalid (4-10 Alpha-Numeric Characters) '.$warning_end.'', 'type'=>'text','uname'=>'true', 'required'=>true, 'len_min'=>4,'len_max'=>10, 'cont' =>'alpha');
  49. $elems[] = array('name'=>'email', 'label'=>''.$warning_start.' Email Is Invalid (ex. sombody@yahoo.com MAX: 50) '.$warning_end.'', 'type'=>'text', 'required'=>true, 'len_max'=>50, 'cont' => 'email');
  50. $elems[] = array('name'=>'password', 'label'=>''.$warning_start.' Password Is Invalid (4-10 Alpha-Numeric Characters) '.$warning_end.'', 'type'=>'text', 'required'=>true, 'len_min'=>4,'len_max'=>10, 'cont' =>'alpha');
  51. $elems[] = array('name'=>'repassword', 'label'=>''.$warning_start.' Passwords Did not Match '.$warning_end.'','type'=>'text', 'required'=>true, 'len_min'=>4,'len_max'=>10, 'cont' =>'alpha','equal'=> array('password'));
  52. $elems[] = array('name'=>'question', 'label'=>''.$warning_start.' Secret Question Is Invalid (4-10 Alpha-Numeric Characters ( NO SPACES )) '.$warning_end.'','type'=>'text', 'required'=>true, 'len_max'=>'10', 'cont' =>'alpha');
  53. $elems[] = array('name'=>'answer', 'label'=>''.$warning_start.' Secret Answer Is Invalid (4-10 Alpha-Numeric Characters) '.$warning_end.'','type'=>'text', 'required'=>true, 'len_max'=>'10', 'cont' =>'alpha');
  54. $elems[] = array('name'=>'idcode','label'=>''.$warning_start.' Personal ID Code Is Invalid (12 Numeric Characters) '.$warning_end.'', 'type'=>'text','uname'=>'true', 'required'=>true, 'len_min'=>8,'len_max'=>8, 'cont' =>'digit');
  55.  
  56.  
  57. $f = new FormValidator($elems);
  58. $err = $f->validate($_POST);
  59.  
  60. if ( $err === true ) {
  61.  
  62. $valid = $f->getValidElems();
  63.  
  64. foreach ( $valid as $k => $v ) {
  65.  
  66. if ( $valid[$k][0][1] == false ) {
  67.  
  68. if ( empty($valid[$k][0][2]) ) {
  69.  
  70. show_error($valid[$k][0][2]);
  71. }else {
  72. show_error($valid[$k][0][2]);
  73. }
  74. }
  75. }
  76.  
  77. } else {
  78.  
  79.  
  80.  
  81.  
  82. //if ($_SESSION['image_random_value'] != md5($verifyinput2)){
  83. //$error= 1;
  84. //show_error("$warning_start Please Go Back And Write Code Correctly! $warning_end");
  85. // }
  86. if ($username_verify > 0){
  87. $error= 1;
  88. show_error("$warning_start Account Is Already In Use, Please Choose Another! $warning_end");
  89. }
  90.  
  91. if ($email_verify > 0){
  92. $error= 0;
  93. }
  94.  
  95.  
  96.  
  97. if ($error!=1){
  98.  
  99. if($muweb['md5'] == 1){
  100.  
  101. $insert_account = $db->Execute("INSERT INTO MEMB_INFO (memb___id,memb__pwd,memb_name,sno__numb,mail_addr,appl_days,modi_days,out__
    days
  102. ,true_days,mail_chek,bloc_code,ctl1_code,memb__pwd2,fpas_ques,fpas_answ,country,
    g
  103. ender) VALUES (?,[dbo].[fn_md5](?,?),'MuWeb',?,?,$date,$date,'2005-01-03','2005-01-03','1','0','0',?,?,?,?,?)",array($account,$password,$account,$idcode,$email,$password,$squestion,$sanswer,$country,$gender));
  104.  
  105. }
  106. elseif($muweb['md5'] == 0){
  107. $insert_account = $db->Execute("INSERT INTO MEMB_INFO (memb___id,memb__pwd,memb_name,sno__numb,mail_addr,appl_days,modi_days,out__
    days
  108. ,true_days,mail_chek,bloc_code,ctl1_code,memb__pwd2,fpas_ques,fpas_answ,country,
    g
  109. ender) VALUES (?,?,'MuWeb',?,?,$date,$date,'2005-01-03','2005-01-03','1','0','0',?,?,?,?,?)",array($account,$password,$idcode,$email,$password,$squestion,$sanswer,$country,$gender));
  110. $insert_account2 = $db->Execute("INSERT INTO VI_CURR_INFO (ends_days,chek_code,used_time,memb___id,memb_name,memb_guid,sno__numb,Bill_
    Sect
  111. ion,Bill_value,Bill_Hour,Surplus_Point,Surplus_Minute,Increase_Days )
  112. VALUES ('2005','1',1234,?,?,1,'7','6','3','6','6','2003-11-23 10:36:00','0' )", array($account,$account));
  113. }
  114.  
  115.  
  116.  
  117. show_error("$ok_start Your Account Has Been Created SuccesFully! $ok_end");
  118. }
  119.  
  120. }
  121.  
  122. }
  123.  
darko
Daj link do działającej strony, a nie dajesz jakieś skrawki kodu w dodatku jeszcze źle otagowane (użyj tagu [php], a nie [code] ) winksmiley.jpg
rakoo
http://eternal-war.no-ip.pl

nie chcialem dawac linka bo zaraaz by mi ktos napisal "a skad mam wiedziec ze to twoja strona" tongue.gif
Mephistofeles
Po co sprawdzać poprawność repassword, nie lepiej od razu porównać?
rakoo
Cytat(Mephistofeles @ 10.12.2009, 20:19:45 ) *
Po co sprawdzać poprawność repassword, nie lepiej od razu porównać?

Narazie "na brudno" mi tak bylo wygodniej smile.gif
darko
Ja odpowiem tak: używam PDO, odpowiednio preparuję składnię zapytań i binduję parametry i mam spokój z SQL injection
rakoo
Hmm ale chyba te zabezpieczenia, ktore zastosowalem powinny zabezpieczyc baze przed niepowolanym dostepem?
darko
To tak na szybko:
1. zamieniłbym zdeprecjonowaną funkcję ereg na preg_match z odpowiednim wzorcem
2. warunki w których występuje: AND $sprawdzenie=1 są niepoprawne, powinno być AND $sprawdzenie==1
3. str_replace w których zamieniasz pojedyncze cudzysłowe wywaliłbym i dał w to miejsce htmlspecialchars
4. korzystaj z funkcji htmlentities
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.