如何在使用php时保护sql注入?id =

时间:2014-01-27 23:28:53

标签: php mysql sql sql-injection

你好我需要帮助找到一种方法来保护我当前项目的sql注入,我正在制作bash教程网站,但我遇到了一个问题。我将大部分内容放在数据库中,根据用户点击的链接,将不同的数据放到页面上。 这就是我正在做的事情

<a href="bash_cmds.php?id=1">apt-get </a><br>

在bash_cmds.php上

<?php
 require_once("connections/connect.php");
  $dbcon = new connection();
  $bash = $_REQUEST['id'];

  $query2 = "SELECT * FROM bash_cmds WHERE id = $bash ";
  $results = $dbcon->dbconnect()->query($query2);

  if($results){

  while($row = $results->fetch(PDO::FETCH_ASSOC)){
  $bash_cmd = $row['bash_command'];
  $how = $row['how_to'];
  } 
  } else { return false; }
  ?>

  <?php echo $bash_cmd ?>
  <br />
  <table>
<tr><td><?php echo $how ?> </td></tr>

</table>

然而,这使我容易受到sql注入,我运行sqlmap并且能够拉出所有数据库和表。有人可以帮忙,我会非常感激它的信息非常宝贵。

3 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点。我认为最好的方法是使用一些数据库抽象层(这是一个很好的内置于PHP中的PDO)并使用其准备好的语句API 。您可以阅读有关PDO here的更多信息,您可以看到将值绑定到?占位符here的特定函数。

或者,您可以使用mysqli_real_escape_string API函数,该函数应该转义$bash变量中的任何SQL。

当然,在这种特殊情况下,简单地确保ID是(int)intval()的整数就足够了,但使用这种方法的一般风险就是它&#39;很容易忘记这样做一次,这就是你的应用程序易受攻击所需的一切。如果您使用像PDO这样的东西,它会更安全,并且#34;有人可能会说 - 意外编写易受攻击的代码更加困难。

答案 1 :(得分:0)

你可以bind the valuesprepared statement

但对于一些简单的数字变量,强制转换为整数就足够了:

$bash = (int) $_REQUEST['id'];

使用此功能,只有一个号码会存储到$bash中。即使有人输入?id=--%20DROP%20TABLE%20xy;,也会输入1;

答案 2 :(得分:0)

我发现防止注射的最简单方法之一就是使用prepared statements

您可以通过PDO在PHP中执行此操作,如CmdrMoozy建议的那样。

预备语句更安全,因为占位符?只能表示值,而不能表示变量(即:永远不会被解释为表名,服务器变量,列名等等。它{当前}可以' t甚至代表一个值列表)。这立即对查询的逻辑进行任何修改都是不可变的,只留下可能不需要的值作为注入可能性(寻找'notanid'的id),这在大多数情况下不是一个问题(他们只是得到一个空白/错误/错误页面,他们试图破解你的网站的错误。)

附录: 当在服务器上完成准备好的语句时,这些限制就是适用的。当编写的语句由库而不是实际作为服务器端模拟时,可能不一样,但通常会模拟其中许多语句。