PDO gigatische error

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • PDO gigatische error

      weer iets waarover ik mijn hersenen ben aan het breken:

      PHP Source Code

      1. <?php
      2. $result = $db->prepare("SELECT * FROM faucets ORDER BY :sorton :order");
      3. $result->bindValue(':sorton', $sorton, PDO::PARAM_STR);
      4. $result->bindValue(':order', $order, PDO::PARAM_STR);
      5. $result->execute();
      6. //$row = $result->fetchAll(PDO::FETCH_ASSOC);
      7. //print_r($row);
      8. $nr = 0;
      9. while($value = $result->fetch(PDO::FETCH_ASSOC)) {
      10. echo "<tr>";
      11. foreach($value as $row) {
      12. $nr = $nr + 1;
      13. echo "<td>".$nr."</td>
      14. <td><a href='".$row['faucet_url']."'>".$row['faucet_name']."</a></td>
      15. <td>".$row['average_reward']."</td>
      16. <td>".$row['reward_hour']."</td>
      17. <td>".$row['wait_time']."</td>
      18. <td>".$row['payement']."</td>";
      19. }
      20. echo "</tr>";
      21. }
      22. ?>
      Display All
      de error is hier te bezichten.

      Hopelijk kan iemand mij helpen want ik zou niet weten wat ik fout gedaan heb.
    • Verander eens dit:

      Source Code

      1. $result = $db->prepare("SELECT * FROM faucets ORDER BY :sorton :order");
      2. $result->bindValue(':sorton', $sorton, PDO::PARAM_STR);
      3. $result->bindValue(':order', $order, PDO::PARAM_STR);
      4. $result->execute();


      In dit:

      Source Code

      1. $result = $db->prepare("SELECT * FROM faucets ORDER BY :sorton :order");
      2. $result->execute(array(':sorton' => $sorton, ':order' => $order));
      Vervolgens, zorg dat $sorton effectief een tabel attribuut bevat en dat $order ook juist is LIMIT *,* ...
      Ik heb nooit eerder tabel attributen of orders gebind, snap ook niet waarom dat nodig is zolang het geen user input is.
      Dus alsnog indien geen user input of op z'n minst door jouw samengestelde input variabelen a.h.v. die user input: dan kan je zonder gebinde parameters werken in je querie:

      Source Code

      1. $result = $db->prepare("SELECT * FROM faucets ORDER BY `$sorton` $order");
      2. $result->execute();

      PS op die pagina lijken de errors uit een ander script te komen.
      Illegal string offset komt voor wanneer je array ongeldige keys of values bevat, een oplossing kan zijn $arr = array("var" => $var); //Werken met dubbele quotes
      Web developer

      The post was edited 1 time, last by MiCa- ().

    • Toevoeging op code van @MiCa-

      PHP Source Code

      1. $result = $db->prepare("SELECT * FROM faucets ORDER BY `$sorton` $order");
      2. $result->execute();
      Hiermee doe je het idee van prepared statement min of meer teniet (door rechtstreeks waarden in je querystring te plakken in plaats van te binden via parameters of values).

      Helaas is het niet mogelijk om dit op een andere manier te doen omdat het simpelweg niet mogelijk is om tabelnamen en -kolommen te binden op deze manier (of extra SQL te schrijven, for that matter). Daarvoor zijn prepared statements niet bedoeld, het is enkel de bedoeling dat je DATA bind, en niets anders.

      Met het bovenstaande introduceer je wel weer de mogelijkheid voor SQL injectie. Omdat je de spelregels van prepared statements met bovenstaande constructie omzeilt is je query hier weer vatbaar voor. Zorg dus dat je met whitelists werkt, oftewel definieer wat toegestane waarden zijn voor $sorton en $order en zorg ervoor dat ze terug kunnen vallen op een geldige (en zinnige) default waarde.

      (Hetgeen in de vorige alinea wordt beschreven komt in wezen neer op input filtering)
    • FangorN wrote:

      Toevoeging op code van @MiCa-

      PHP Source Code

      1. $result = $db->prepare("SELECT * FROM faucets ORDER BY `$sorton` $order");
      2. $result->execute();
      Hiermee doe je het idee van prepared statement min of meer teniet (door rechtstreeks waarden in je querystring te plakken in plaats van te binden via parameters of values).

      Helaas is het niet mogelijk om dit op een andere manier te doen omdat het simpelweg niet mogelijk is om tabelnamen en -kolommen te binden op deze manier (of extra SQL te schrijven, for that matter). Daarvoor zijn prepared statements niet bedoeld, het is enkel de bedoeling dat je DATA bind, en niets anders.

      Met het bovenstaande introduceer je wel weer de mogelijkheid voor SQL injectie. Omdat je de spelregels van prepared statements met bovenstaande constructie omzeilt is je query hier weer vatbaar voor. Zorg dus dat je met whitelists werkt, oftewel definieer wat toegestane waarden zijn voor $sorton en $order en zorg ervoor dat ze terug kunnen vallen op een geldige (en zinnige) default waarde.
      Ik bedoelde, wanneer jij zelf de tabel kolommen valideert en je order string ook netjes valideerd a.h.v. enige input dan kan je perfect deze variabelen in je query toevoegen zonder dat iemand daarop kan inspelen. Data zoals jij aangeeft aan de andere kant moet wel steeds gebind worden en daarvoor beveel ik het 2e stukje code aan in mijn eerdere post i.p.v. iedere parameter in een aparte lijn te gaan binden. Data zal meestal ook alleen maar voorkomen in de WHERE clause.

      Kolommen valideren kan al met een simpele array met toegankelijke kollomen, en je order kan gwn a.h.v. je gebruikers input, switch die en maak je string op met int waarden indien user input geen int waarde is stel je gwn een standaar in zoals bv: LIMIT 0,10
      Dit is vooral handig bij dynamische code, functies die op meerdere vesrch wijzen gebruikt kunnen worden. Het is veilig zolang je weet wat je doet..
      Web developer

      The post was edited 1 time, last by MiCa- ().

    • pff. ik heb er echt een zootje van gemaakt geen enkel van bovenstaande werkt.

      de volledige pagina:

      PHP Source Code

      1. <?php
      2. include "config.php";
      3. $sorton = "average_reward";
      4. $order = "DESC";
      5. if(isset($_GET['sorton'])){
      6. $sorton = $_GET['sorton'];
      7. $order = $_GET['order'];
      8. }
      9. ?>
      10. <html>
      11. <head>
      12. <!-- Latest compiled and minified CSS -->
      13. <link rel="stylesheet" href="https://bootswatch.com/darkly/bootstrap.min.css">
      14. <!-- jQuery library -->
      15. <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
      16. <!-- Latest compiled JavaScript -->
      17. <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
      18. <title>Bitylist</title>
      19. <meta charset="utf-8">
      20. <meta name="viewport" content="width=device-width, initial-scale=1">
      21. </head>
      22. <body>
      23. <div class="container">
      24. <div class="jumbotron">
      25. <h1><img src="http://bitcoin.i-rme.es/img/Bitcoin%20Logo%204096%20PNG%20Forocoches%20(RME).png" height="100px">Bitylist</h1>
      26. <p>Welcome to Bitylist! Bitylist is a smart faucetlist where you can open multiple faucets simultaneously instead of clicking them case-by-case. You have also the possibility of sorting them.</p>
      27. <p>Faucet balance: <?php echo get_balance($key); ?> satoshi</p>
      28. <div class="form-group">
      29. <label class="control-label">Claim reward:</label>
      30. <div class="input-group">
      31. <span class="input-group-addon">Bitcoin adress</span>
      32. <input type="text" class="form-control" placeholder="Enter your bitcoin adress here like '1CvBm4AoS7TVVVv5XC1wPiyMrpk4n8rzNC'.">
      33. <span class="input-group-btn">
      34. <button class="btn btn-default" type="button">Claim!</button>
      35. </span>
      36. </div>
      37. </div>
      38. </div>
      39. <div class="panel panel-default">
      40. <div class="panel-heading">
      41. <h3 class="panel-title">Faucet list</h3>
      42. </div>
      43. <div class="panel-body">
      44. <div class="form-group">
      45. <form method="post">
      46. <label class="control-label">Open faucets in new window:</label>
      47. <div class="input-group">
      48. <span class="input-group-addon">Till which number?</span>
      49. <input type="text" class="form-control" name="num">
      50. <span class="input-group-btn">
      51. <button class="btn btn-default" type="submit" name="submit">Open!</button>
      52. </span>
      53. </div>
      54. </form>
      55. </div>
      56. <table class="table table-striped table-hover">
      57. <thead>
      58. <tr>
      59. <th>nr.</th>
      60. <th><a href="index.php?sorton=faucet_name&order=ASC">Faucet</a></th>
      61. <th><a href="index.php?sorton=average_reward&order=DESC">average reward</a></th>
      62. <th><a href="index.php?sorton=reward_hour&order=DESC">average reward/hour</a></th>
      63. <th><a href="index.php?sorton=time&order=ASC">interval (min.)</a></th>
      64. <th><a href="index.php?sorton=payement&order=ASC">payement</a></th>
      65. </tr>
      66. </thead>
      67. <tbody>
      68. <?php
      69. $result = $db->prepare("SELECT * FROM faucets ORDER BY ".$sorton." ".$order."");
      70. $result->execute();
      71. //$row = $result->fetchAll(PDO::FETCH_ASSOC);
      72. //print_r($row);
      73. $nr = 0;
      74. while($value = $result->fetch(PDO::FETCH_ASSOC)) {
      75. echo "<tr>";
      76. foreach($value as $row) {
      77. $nr = $nr + 1;
      78. echo "<td>".$nr."</td>
      79. <td><a href='".$row['faucet_url']."'>".$row['faucet_name']."</a></td>
      80. <td>".$row['average_reward']."</td>
      81. <td>".$row['reward_hour']."</td>
      82. <td>".$row['wait_time']."</td>
      83. <td>".$row['payement']."</td>";
      84. }
      85. echo "</tr>";
      86. }
      87. /*$sql = "SELECT * FROM faucets ORDER BY ".$sorton." ".$order."";
      88. $result = $con->query($sql);
      89. if ($result->num_rows > 0) {
      90. // output data of each row
      91. $nr = 0;
      92. while($row = $result->fetch_assoc()) {
      93. $nr = $nr + 1;
      94. echo "
      95. <tr>
      96. <td>".$nr."</td>
      97. <td><a href='".$row['faucet_url']."'>".$row['faucet_name']."</a></td>
      98. <td>".$row['average_reward']."</td>
      99. <td>".$row['reward_hour']."</td>
      100. <td>".$row['wait_time']."</td>
      101. <td>".$row['payement']."</td>
      102. </tr>";
      103. }
      104. }
      105. else {
      106. echo "0 results";
      107. }
      108. */
      109. ?>
      110. </tbody>
      111. </table>
      112. </div>
      113. <div class="panel-footer"><center>© bitypalace.eu | | <a href="mailto:[email protected]?SUBJECT=Bitypalace contact">Contact</a><center></div>
      114. </div>
      115. </div>
      116. <script>
      117. <?php
      118. /*
      119. if (isset($_POST['submit'])){
      120. $result = $db->prepare("SELECT * FROM faucets ORDER BY :sorton :order");
      121. $stmt->bindValue(':sorton', $sorton, PDO::PARAM_STR);
      122. $stmt->bindValue(':order', $order, PDO::PARAM_STR);
      123. $result->execute();
      124. $maxnumber = $_POST['num'];
      125. $number = 0;
      126. while ($row = $db->fetchAll(PDO::FETCH_ASSOC))
      127. {
      128. ?>
      129. //add this line for each website you want to open
      130. window.open("<?php echo $row['faucet_url']; ?>",'');
      131. <?php
      132. $number = $number + 1;
      133. if($number == $maxnumber){
      134. break;
      135. }
      136. }*/
      137. /*$sql = "SELECT * FROM faucets ORDER BY ".$sorton." ".$order."";
      138. $result = $con->query($sql);
      139. $maxnumber = $_POST['num'];
      140. $number = 0;
      141. if ($result->num_rows > 0) {
      142. // output data of each row
      143. while($row = $result->fetch_assoc()) {
      144. ?>
      145. //add this line for each website you want to open
      146. window.open("<?php echo $row['faucet_url']; ?>",'');
      147. <?php
      148. $number = $number + 1;
      149. if($number == $maxnumber){
      150. break;
      151. }
      152. }
      153. }
      154. }*/
      155. ?>
      156. </script>
      157. </body>
      158. </html>
      Display All