Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [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
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ę.... 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 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 wink.gif

EDIT: na czerwono smile.gif

Ten post edytował Sephirus 8.12.2014, 12:21:46


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 05:20