Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL][PHP]Sprawdzenie poprawności skryptu
Forum PHP.pl > Forum > Przedszkole
troian
Witam, mam napisany skrypt jednak ktoś usilnie twierdzi że można go obejść, czy ktoś mógł by zerknąć na ów skrypt i powiedzieć mi czy jest możliwość złamania/obejścia tego skryptu jeżeli ktoś widzi jakąś nieprawidłowość proszę mi powiedzieć postaram się to naprawić w miarę możliwości
  1. function canBuy()
  2. {
  3. if(!isset($_SESSION['nextBuy']))
  4. {
  5. $_SESSION['nextBuy']=time();
  6. }
  7.  
  8. if($_SESSION['nextBuy']<=time())
  9. {
  10. $_SESSION['nextBuy']=time()+10;
  11. return true;
  12. }
  13. else
  14. return false;
  15. }
  16.  
  17. if(isset($_SESSION['id'])) {
  18.  
  19. if(isset($_GET['id']) && checkInt($_GET['id'])) {
  20.  
  21.  
  22. $sqlCmd="SELECT id_itemu, ilosc, cena, nazwa, attrtype0, attrvalue0, attrtype1, attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3, attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6, socket0, socket1, socket2 FROM strona.itemy_itemshop WHERE id='".$_GET['id']."' AND status='1' LIMIT 1";
  23. $sqlQry=mysql_query($sqlCmd,$polaczenie);
  24. if(mysql_num_rows($sqlQry)==1) {
  25.  
  26. $getItem=mysql_fetch_object($sqlQry);
  27.  
  28. $sqlCoins = "SELECT coins FROM account.account WHERE id='".$_SESSION['id']."' LIMIT 1";
  29. $qryCoins = mysql_query($sqlCoins,$polaczenie);
  30. $getCoins = mysql_fetch_object($qryCoins);
  31.  
  32.  
  33. if(canBuy())
  34. {
  35. if(($getCoins->coins)>=$getItem->cena) {
  36.  
  37. $getGroesse = compareItems($getItem->id_itemu);
  38. $belPos = checkPos($_SESSION['user_id']);
  39. $possiblePos = findPos($belPos['islager'],$getGroesse['groesse']);
  40. if(!empty($possiblePos)) {
  41.  
  42. $nCoins = $getCoins->coins-$getItem->cena;
  43.  
  44. $sqlCmd="UPDATE account.account SET coins='".$nCoins."' WHERE id='".$_SESSION['id']."' LIMIT 1";
  45. $sqlQry=mysql_query($sqlCmd,$polaczenie);
  46. if($getItem->socket0 > 0)
  47. {
  48. $aktualnadata = date("Y-m-d H:i:s");
  49. $socket0 = strtotime($aktualnadata) + $getItem->socket0;
  50. }
  51. $sqlItem="INSERT INTO player.item
  52. (owner_id,window,pos,count,vnum,attrtype0, attrvalue0, attrtype1, attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3, attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6, socket0, socket1, socket2)
  53. VALUES
  54. ('".addslashes($_SESSION['id'])."','MALL','".$possiblePos[0]."','".$getItem->ilosc."','".$getItem->id_itemu."','".$getItem->attrtype0."', '".$getItem->attrvalue0."', '".$getItem->attrtype1."', '".$getItem->attrvalue1."', '".$getItem->attrtype2."', '".$getItem->attrvalue2."', '".$getItem->attrtype3."', '".$getItem->attrvalue3."', '".$getItem->attrtype4."', '".$getItem->attrvalue4."', '".$getItem->attrtype5."', '".$getItem->attrvalue5."', '".$getItem->attrtype6."', '".$getItem->attrvalue6."', '".$socket0."', '".$getItem->socket1."', '".$getItem->socket2."')";
  55. $qryItem=mysql_query($sqlItem,$polaczenie) or die(mysql_error());
  56. $data = date("Y-m-d H:i");
  57. $dodaj = mysql_query("INSERT INTO strona.zakupy SET
  58. data = '".$data."',
  59. login = '".$_SESSION['login']."',
  60. nazwa_itemu ='".$getItem->nazwa."',
  61. id_itemu = '".$getItem->id_itemu."',
  62. zapis='OK'
  63. ");
  64. <div class="okno_informacji okno_udana">
  65. Przedmiot pomyślnie kupiony!
  66. </div><br>
  67. ';
  68. }
  69. else {
  70. <div class="okno_informacji okno_blad">
  71. Brak miejsca w Item Shop\'ie!
  72. </div><br>
  73. ';
  74. }
  75.  
  76. }
  77. else {
  78. <div class="okno_informacji okno_blad">
  79. Masz zbyt małą ilość SM!
  80. </div><br>
  81. ';
  82. }
  83. }
  84. else
  85. {
  86. <div class="okno_informacji okno_blad">
  87. Nie możesz tak często kupować!
  88. </div><br>
  89. ';
  90. }
  91. }
  92. else {
  93. <div class="okno_informacji okno_blad">
  94. Nie ma takiego przedmiotu w Sklepie!
  95. </div><br>
  96. ';
  97. }
  98. }
  99. else {
  100. <div class="okno_informacji okno_blad">
  101. Błąd skryptu!
  102. </div><br>
  103. ';
  104. }
  105. echo'<p><br><br>Powrót do item shop za 5 sek, jeżeli cie nie przeniesie kliknij <a href="java script:history.back()">Powrót</a></p>
  106. <meta http-equiv="refresh" content="4; URL=/konto/sklep">
  107. ';
  108. }
  109. else {
  110.  
  111. }


Nie proszę o napisanie gotowej poprawki proszę tylko mi wskazać w jaki sposób można tego dokonać [ Jeżeli wgl się da ] bo nie jestem pewny równie dobrze koleś może cisnąć ściemę, a ja nie jestem dokonica przekonany bo miałem jeden włam już z powodu innego drobnego błędu.
Turson
Słyszałeś, że można a nawet zaleca się stosowanie tabulacji w celu lepszej czytelności kodu?
Co robi funkcja checkInt()?
troian
Cytat(Turson @ 7.12.2014, 15:05:14 ) *
Słyszałeś, że można a nawet zaleca się stosowanie tabulacji w celu lepszej czytelności kodu?
Co robi funkcja checkInt()?


Sprawdza czy wartość jest liczbowa jeżeli tak zezwala jeżeli nie blokuje całą funkcję

MAM taby tylko coś podczas kopiowania się.... haha.gif
maviozo
Polecam przejść na PDO, zabezpieczyłeś się przed SQL Injection?
Dla mnie słabym punktem jest np. to:
Cytat
WHERE id='".$_GET['id']."'
troian
Cytat(maviozo @ 7.12.2014, 23:10:12 ) *
Polecam przejść na PDO, zabezpieczyłeś się przed SQL Injection?
Dla mnie słabym punktem jest np. to:


CheckInt sprawdza czy $_GET[] jest wartością liczbową bez ', } ,) itp wink.gif jeżeli jakikolwiek inny znak po za [0-9] zostanie wprowadzony do geta funkcja sprawdza return i cały IF zwraca błąd
Sephirus
To i tak zła praktyka z tym GETem. Staraj się raczej robić coś na zasadzie:

  1. if(waliduj($_GET['xxx']) {
  2.  
  3. $xxx = $_GET['xxx'];
  4.  
  5. // ...
  6.  
  7. wykonaj('SELECT * FROM costam WHERE id = '.$xxx);
  8.  
  9. }


Tak żeby samo $_GET nie trafiło do zapytania - kto wie czy gdzieś kiedyś tego nie skopiujesz? A jeśli będzie $xxx to wymusi przekazanie wartości i przy okazji walidację.

Ponadto - przejdź na to PDO - ułatwia walidację i pomaga w obronie przed sqlInjection wink.gif

EDIT: na czerwono smile.gif
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.