Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SQL][PHP]Sprawdzenie poprawności skryptu
troian
post
Post #1





Grupa: Zarejestrowani
Postów: 184
Pomógł: 2
Dołączył: 3.02.2013

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


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.

Ten post edytował troian 7.12.2014, 14:48:33
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
Turson
post
Post #2





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Słyszałeś, że można a nawet zaleca się stosowanie tabulacji w celu lepszej czytelności kodu?
Co robi funkcja checkInt()?
Go to the top of the page
+Quote Post
troian
post
Post #3





Grupa: Zarejestrowani
Postów: 184
Pomógł: 2
Dołączył: 3.02.2013

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


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ę.... (IMG:style_emoticons/default/haha.gif)

Ten post edytował troian 7.12.2014, 18:24:11
Go to the top of the page
+Quote Post
maviozo
post
Post #4





Grupa: Zarejestrowani
Postów: 197
Pomógł: 24
Dołączył: 22.11.2010

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


Polecam przejść na PDO, zabezpieczyłeś się przed SQL Injection?
Dla mnie słabym punktem jest np. to:
Cytat
WHERE id='".$_GET['id']."'
Go to the top of the page
+Quote Post
troian
post
Post #5





Grupa: Zarejestrowani
Postów: 184
Pomógł: 2
Dołączył: 3.02.2013

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


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 (IMG:style_emoticons/default/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
Go to the top of the page
+Quote Post
Sephirus
post
Post #6





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


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 (IMG:style_emoticons/default/wink.gif)

EDIT: na czerwono (IMG:style_emoticons/default/smile.gif)

Ten post edytował Sephirus 8.12.2014, 12:21:46
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: 22.08.2025 - 20:05