Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP MYSQL] Czy ten skrypt jest bezpieczny?
Forum PHP.pl > Forum > PHP
julek12
Witam,
Napisałem skrypt na VIP sms i chciałbym wiedzieć czy jest on bezpieczny oraz czy jest dobrze napisany
  1. <p><b>Krok po kroku:</b><br />
  2. 1. Czytasz regulamin usługi<br />
  3. 2. Wysyłasz sms o treści xxx pod numer xxx<br />
  4. 3. Wpisujesz swoją nazwę użytkownika z forum (wielkość liter brana pod uwagę)<br />
  5. 4. Wpisujesz kod, jaki dostałeś w smsie zwrotnym<br />
  6. 5. Klikasz "Zrob ze mnie przyjaciela!"<br />
  7. 6. Sprawdzasz czy masz nową grupę</p>
  8.  
  9. <p><form action="vip.php" method="post">
  10.        <p>
  11.        <label>Twój nick</label>
  12.        <input type="text" name="nick" value="" />
  13.        <label>Kod</label>
  14.        <input type="text" name="check" maxlenght="8">
  15.        <input class="button" type="submit" value="Zamawiam Vip" />
  16.        </p>
  17.        </form></p>
  18.  
  19. <?php
  20. mysql_connect('xxxx', 'xxxx', 'xxxx') or
  21. die ('Niepoprawne polaczenie z baza danych ');
  22. mysql_select_db('xxx_mybb') or die ('Zla baza danych');
  23.  
  24. $t = time();
  25.  
  26. $id = "xx";
  27. $code = "xx";
  28. $type = "sms";
  29. $grupa = '8';
  30.  
  31. $nick = $_POST['nick'];
  32. $check = $_POST['check'];
  33. $del=1;
  34.  
  35. $m = "SELECT * FROM `mybb_users` WHERE `username` = '".$nick."'";
  36. $wykonanie = mysql_query($m) or die ("Nie mogę wykonać zapytania.");
  37. $n = mysql_num_rows($wykonanie);
  38. if ($n == 0 && $check != NULL)
  39. {
  40. echo "Niepoprawny nick.<br />";
  41. }
  42. else
  43. {
  44.  
  45. $zgroup = "SELECT `usergroup` FROM `mybb_users` WHERE `username` = '".$nick."'";
  46. $wgroup = mysql_query($zgroup) or die ("Nie mogę wykonać zapytania.");
  47. $group = mysql_fetch_array($wgroup);
  48.  
  49. if ($group[usergroup] == 3)
  50. {
  51. echo "Jesteś super moderatorem, a chcesz zostać VIPem? TO NIEMOŻLIWE.";
  52. }
  53. else if ($group[usergroup] == 4)
  54. {
  55. echo "Jesteś administratorem, a chcesz zostać VIPem? TO NIEMOŻLIWE.";
  56. }
  57. else if ($group[usergroup] == 5)
  58. {
  59. echo "Twoje konto jest zawieszone. Dokonaj pełnej aktywacji i będziesz mógł kupić konto VIP.";
  60. }
  61. else if ($group[usergroup] == 6)
  62. {
  63. echo "Jesteś moderatorem, a chcesz zostać VIPem? TO NIEMOŻLIWE.";
  64. }
  65. else if ($group[usergroup] == 7)
  66. {
  67. echo "Twoje konto zostało zbanowane. Dopiero, gdy minie Ci ban będziesz mógł zakupić konto VIP.";
  68. }
  69. else if ($group[usergroup] == 12)
  70. {
  71. echo "Jesteś redaktorem, a chcesz zostać VIPem? TO NIEMOŻLIWE.";
  72. }
  73. else
  74. {
  75. if($check == NULL)
  76. echo 'Proszę wpisać kod';
  77.  
  78. $handle = fopen("http://dotpay.pl/check_code.php?id=".$id."&code=".$code."&check=".$check."&type=".$type."&del=".$del, 'r');
  79.    $status = fgets($handle, 8);
  80.    $czas_zycia = fgets($handle, 24);
  81.    fclose($handle);
  82.    $czas_zycia = rtrim($czas_zycia);
  83.  
  84.    if ($status == 0 && $check != NULL)
  85.    {
  86.    echo "Kod niepoprawny.";
  87.    }
  88.    else
  89.    {
  90.    if (!isset($_COOKIE['ActiveCode']) && $check != NULL)
  91.    {
  92. mysql_query("UPDATE `xxx_mybb`.`mybb_users` SET `usergroup` = '".$grupa."',
  93. `vip` = '".$t."' WHERE `mybb_users`.`username` ='".$nick."'");
  94. echo "<font color=\"red\"><b>Konto dostało VIPa! Teraz nie spamuj i się nie podniecaj.. tongue.gif !</b></font>";
  95.    }
  96. }
  97. }
  98. }
  99. ?>
Mephistofeles
Skrypt raczej podatny na SQL Injection - nie filtrujesz $nick. A czy dobrze napisany? U mnie by to nie przeszło, ale jak działa, to chyba dobrze winksmiley.jpg.
Aa, i jeszcze jedno, jeżeli nie korzystasz ze zmiennych wewnątrz łańcucha, to zamykaj go apostrofami a nie cudzysłowami, podobno szybciej, ale przynajmniej nie trzeba wtedy slashować cudzysłowów w HTMLu.
julek12
@up
dzięki. o co ci chodzi z tymi apostrofami i cudzysłowami??

  1. <?php
  2. $nick = mysql_real_escape_string($_POST['nick']);
  3. ?>


lepiej?
Mephistofeles
Np. o to:
  1. <?php
  2. echo "<font color=\"red\"><b>Konto dostało VIPa! Teraz nie spamuj i się nie podniecaj.. tongue.gif !</b></font>";
  3. ?>

Jeśli łańcuch rozpoczynasz cudzysłowem, to musisz slashować każdy cudzysłów wewnątrz, a skoro i tak nie wykorzystujesz czegoś takiego:
"coś tam $jakaszmienna" to ograniczaj lepiej łańcuchy apostrofami. 'coś tam' (+ ewentualnie) . $jakaśzmienna
julek12
Aha dzieki.

Teraz kod wygląda tak:
  1. Kup konto VIP, aby zakupić konto VIP wyślij SMSa:
  2. <br><b>* Na numer <font color="red">xx</font> o tresci <font color="red"><b>xx</b></font> za <font color="red"><b>3.66 zl brutto</b></font>, a za kod dostaniesz <font color="red"><b>100</b></font> punktow premium.</b><br />
  3.  
  4.    Serwis SMS obsługiwany przez <a href="http://www.dotpay.pl" target="_blank">Dotpay.pl</a><br>
  5.    Regulamin: <a href="http://www.dotpay.pl/regulaminsms" target="_blank">http://www.dotpay.pl/regulaminsms</a><br>
  6.    Usługa dostępna w sieciach: Era, Plus GSM, Orange, Play (+ Sami Swoi, Heyah, Tak Tak, Simplus, Orange GO, POP).<br>
  7.    <b>TibiaServ</b> nie odpowieda za źle wpisane treści SMS.<br /><br />
  8.  
  9.        <form action="vip/" method="post">
  10.        Twój nick:<br />
  11.        <input type="text" name="nick" value="" /><br /><br />
  12.        Kod:<br />
  13.        <input type="text" name="check" maxlenght="8"><br />
  14.        <input class="button" type="submit" value="Zamawiam Vip" /><br />
  15.        </form><br />
  16.  
  17. <?php
  18. mysql_connect('localhost', 'xx', 'xx') or
  19. die ('Niepoprawne polaczenie z baza danych ');
  20. mysql_select_db('xx_mybb') or die ('Zla baza danych');
  21.  
  22. $t = time();
  23.  
  24. $id = "xx";
  25. $code = "xx";
  26. $type = "sms";
  27. $grupa = '8';
  28.  
  29. $nick = mysql_real_escape_string($_POST['nick']);
  30. $check = $_POST['check'];
  31. $del=1;
  32.  
  33. $m = "SELECT * FROM `mybb_users` WHERE `username` = '".$nick."'";
  34. $wykonanie = mysql_query($m) or die ("Nie mogę wykonać zapytania.");
  35. $n = mysql_num_rows($wykonanie);
  36. if ($n == 0 && $check != NULL)
  37. {
  38. echo '<b>Niepoprawny nick.</b><br />';
  39. }
  40. else
  41. {
  42.  
  43. $zgroup = "SELECT `usergroup` FROM `mybb_users` WHERE `username` = '".$nick."'";
  44. $wgroup = mysql_query($zgroup) or die ("Nie mogę wykonać zapytania.");
  45. $group = mysql_fetch_array($wgroup);
  46.  
  47. if ($group[usergroup] == 3)
  48. {
  49. echo '<b>Jesteś super moderatorem, a chcesz zostać VIPem? TO NIEMOŻLIWE.</b>';
  50. }
  51. else if ($group[usergroup] == 4)
  52. {
  53. echo '<b>Jesteś administratorem, a chcesz zostać VIPem? TO NIEMOŻLIWE.</b>';
  54. }
  55. else if ($group[usergroup] == 5)
  56. {
  57. echo '<b>Twoje konto jest zawieszone. Dokonaj pełnej aktywacji i będziesz mógł kupić konto VIP.</b>';
  58. }
  59. else if ($group[usergroup] == 6)
  60. {
  61. echo '<b>Jesteś moderatorem, a chcesz zostać VIPem? TO NIEMOŻLIWE.</b>';
  62. }
  63. else if ($group[usergroup] == 7)
  64. {
  65. echo '<b>Twoje konto zostało zbanowane. Dopiero, gdy minie Ci ban będziesz mógł zakupić konto VIP.</b>';
  66. }
  67. else if ($group[usergroup] == 12)
  68. {
  69. echo '<b>Jesteś redaktorem, a chcesz zostać VIPem? TO NIEMOŻLIWE.</b>';
  70. }
  71. else
  72. {
  73. if($check == NULL)
  74. echo '<b>Proszę wpisać kod.</b>';
  75.  
  76. $handle = fopen("http://dotpay.pl/check_code.php?id=".$id."&code=".$code."&check=".$check."&type=".$type."&del=".$del, 'r');
  77.    $status = fgets($handle, 8);
  78.    $czas_zycia = fgets($handle, 24);
  79.    fclose($handle);
  80.    $czas_zycia = rtrim($czas_zycia);
  81.  
  82.    if ($status == 0 && $check != NULL)
  83.    {
  84.    echo '<b>Niepoprawny kod.</b>';
  85.    }
  86.    else
  87.    {
  88.    if (!isset($_COOKIE['ActiveCode']) && $check != NULL)
  89.    {
  90.  
  91. $z8 = "SELECT `vip` FROM `mybb_users` WHERE `username` = '".$nick."'";
  92. $w8 = mysql_query($z8) or die ("Nie mogę wykonać zapytania.");
  93. $o8 = mysql_fetch_array($w8);
  94. $o = $o8[vip] + (60*60*24*30);
  95. $t1 = $t + (60*60*24*30);
  96.  
  97.        if ($group[usergroup] == 8)
  98.        {
  99. mysql_query("UPDATE `julek12_mybb`.`mybb_users` SET `vip` = '".$o."' WHERE `mybb_users`.`username` ='".$nick."'");
  100. echo '<font color=\"red\"><b>Twoje konto VIP zostało przedłużone o 30 dni.</b></font>';
  101.        }
  102.        else
  103.        {
  104. mysql_query("UPDATE `julek12_mybb`.`mybb_users` SET `usergroup` = '".$grupa."',
  105. `vip` = '".$t1."' WHERE `mybb_users`.`username` ='".$nick."'");
  106. echo '<font color=\"red\"><b>Twoje konto zyskało VIPa.</b></font>';
  107.        }
  108.    }
  109. }
  110. }
  111. }
  112. ?>
Mephistofeles
Nom. Chociaż oczywiście można lepiej, np. użyć PDO smile.gif. Ale po co w tak prostym skrypcie winksmiley.jpg.
julek12
PDO - co to??

Napisał byś mi twoją wersje? Lepszą:)
Mephistofeles
PDO to biblioteka obsługi MySQLa, ale warunek: PHP co najmniej 5. Główne zalety to szybkość, odporność na SQL Injection, i łatwość obsługi. Poczytaj na WebCity.pl
Nie mam czasu zagłębiać się w działanie twojego skryptu, ale jak masz dostęp do PHP 5 to polecam użycie PDO.
julek12
Oczywiście, że mam php 5 a kto teraz nie ma:)
Mephistofeles
Używaj też switcha zamiast tylu ifów. Jutro ci napiszę może coś ładnego winksmiley.jpg.
julek12
dzieki:)
Mephistofeles
  1. <p>
  2.   <b>Krok po kroku:</b><br />
  3.   1. Czytasz regulamin usługi<br />
  4.   2. Wysyłasz sms o treści xxx pod numer xxx<br />
  5.   3. Wpisujesz swoją nazwę użytkownika z forum (wielkość liter brana pod uwagę)<br />
  6.   4. Wpisujesz kod, jaki dostałeś w smsie zwrotnym<br />
  7.   5. Klikasz "Zrób ze mnie przyjaciela!"<br />
  8.   6. Sprawdzasz czy masz nową grupę
  9. </p>
  10.  
  11. <form action="test.php" method="post">
  12.  <p>
  13.     <label>Twój nick</label>
  14.     <input type="text" name="nick" maxlenght="32" />
  15.     <label>Kod</label>
  16.     <input type="text" name="check" maxlenght="8" />
  17.     <input class="button" type="submit" value="Zamawiam Vip" />
  18.  </p>
  19. </form>
  20.  
  21. <?php
  22. try
  23. {
  24.   $nick = $_POST['nick'];
  25.   $check = $_POST['check'];
  26.  
  27.   if (!$nick or !$check)
  28.      throw new Exception('Nie wpisałeś wymaganych danych!');
  29.  
  30.   $pdo = new PDO('mysql:host=hostBazyDanych;dbname=nazwaBazy', 'login', 'haslo'); // Inicjacja bazy bez parametrów kodowania
  31.   //$pdo = new PDO('mysql:host=hostBazyDanych;dbname=nazwaBazy', 'login', 'haslo', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')); // Inicjacja bazy z kodowaniem UTF-8
  32.   $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Ustawienia parametrów wyjątków PDO
  33.  
  34.   $sql = $pdo->prepare('SELECT `usergroup` FROM `mybb_users` WHERE `username` = :nick'); // Przygotowuanie zapytania
  35.   $sql->bindValue(':nick', $nick, PDO::PARAM_STR); // Podpinanie jest odporne na SQL Injection ;], a na dodatek szybsze
  36.   $sql->execute(); // Wykonanie
  37.   $data = $sql->fetch(PDO::FETCH_ASSOC); // Pobranie tablicy asocjacyjnej
  38.  
  39.   if (!$data)
  40.      throw new Exception('Wpisałeś niepoprawny nick!<br />'); // Wyrzucamy wyjątek, jeśli nie pobrano żadnych danych z bazy
  41.   $sql->closeCursor(); // Zamykam uchwyt
  42.  
  43.   switch($data['usergroup'])
  44.   {
  45.       case 3:
  46.          throw new Exception('Jesteś już super moderatorem, a chcesz zostać VIPem? To Ci zupełnie niepotrzebne :).');
  47.          break;
  48.       case 4:
  49.          throw new Exception('Jesteś już administratorem, a chcesz zostać VIPem? To Ci zupełnie niepotrzebne :).');
  50.          break;
  51.       case 5:
  52.          throw new Exception('Twoje konto jest zawieszone. Konto VIP przydzielamy jedynie w pełni aktywowanym użytkownikom!');
  53.          break;      
  54.       case 6:
  55.          throw new Exception('Jesteś już moderatorem, a chcesz zostać VIPem? To Ci zupełnie niepotrzebne :).');
  56.          break;
  57.       case 7:
  58.          throw new Exception('Twoje konto obecnie jest zbanowane. Poczekaj aż minie okres bana!');
  59.          break;
  60.       case 12:
  61.          throw new Exception('Jesteś już redaktorem, a chcesz zostać VIPem? To Ci zupełnie niepotrzebne :).');
  62.          break;
  63.    }
  64.  
  65.   // $del=1; Skoro tego nie zmieniasz, to po co to jest? Wystarczy wpisać na stałe
  66.    // $t = time(); Skoro tego nie zmieniasz, to po co to jest? Wystarczy wpisać na stałe
  67.   // $id = "xx"; Skoro tego nie zmieniasz, to po co to jest? Wystarczy wpisać na stałe
  68.   // $code = "xx"; Skoro tego nie zmieniasz, to po co to jest? Wystarczy wpisać na stałe
  69.   // $type = "sms"; Skoro tego nie zmieniasz, to po co to jest? Wystarczy wpisać na stałe
  70.   // $grupa = '8'; Skoro tego nie zmieniasz, to po co to jest? Wystarczy wpisać na stałe    
  71.  
  72.    $handle = fopen('http://dotpay.pl/check_code.php?id=xx&code=xx&check='.$check.'&type=sms&del=1', 'r');
  73.   $status = fgets($handle, 8);
  74.   // $czas_zycia = fgets($handle, 24); // A to po co? Nie wykorzystujesz tego dalej...
  75.   fclose($handle);
  76.   // $czas_zycia = rtrim($czas_zycia); // Jak wyżej...
  77.  
  78.   if ($status == 0)
  79.      throw new Exception('Kod niepoprawny!');
  80.      
  81.  
  82.   if (!isset($_COOKIE['ActiveCode']))
  83.   {
  84.       if ($data['usergroup'] == 8)  
  85.       {
  86.           $sql = $pdo->prepare('UPDATE `mybb_users` SET `usergroup` = 8, `vip` = `vip` + :vip WHERE `username` = :nick');
  87.          $sql->bindValue(':vip', 25920000, PDO::PARAM_INT);
  88.        }
  89.        else
  90.        {
  91.           $sql = $pdo->prepare('UPDATE `mybb_users` SET `usergroup` = 8, `vip` = :vip WHERE `username` = :nick');
  92.          $sql->bindValue(':vip', time() + 25920000, PDO::PARAM_INT);
  93.      }
  94.       $sql->bindValue(':nick', $nick, PDO::PARAM_STR);
  95.       $sql->execute();
  96.       echo '<font color="red"><b>Konto dostało VIPa! Teraz nie spamuj i się nie podniecaj!</b></font>'; // To strasznie niepoprawne HTMLowo jest, zmień to lepiej na style CSS
  97.    }
  98.  
  99. }
  100. catch(Exception $e) // Łapiemy błędy
  101. {
  102.    echo $e->getMessage(); // Wyświetlamy treść błędu
  103. }
  104. ?>

Powinno działać smile.gif. Jak coś to pisz.
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.