你好我需要帮助找到一种方法来保护我当前项目的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
并且能够拉出所有数据库和表。有人可以帮忙,我会非常感激它的信息非常宝贵。
答案 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 values到prepared statement。
但对于一些简单的数字变量,强制转换为整数就足够了:
$bash = (int) $_REQUEST['id'];
使用此功能,只有一个号码会存储到$bash
中。即使有人输入?id=--%20DROP%20TABLE%20xy;
,也会输入1
;
答案 2 :(得分:0)
我发现防止注射的最简单方法之一就是使用prepared statements。
您可以通过PDO在PHP中执行此操作,如CmdrMoozy建议的那样。
预备语句更安全,因为占位符?
只能表示值,而不能表示变量(即:永远不会被解释为表名,服务器变量,列名等等。它{当前}可以' t甚至代表一个值列表)。这立即对查询的逻辑进行任何修改都是不可变的,只留下可能不需要的值作为注入可能性(寻找'notanid'的id),这在大多数情况下不是一个问题(他们只是得到一个空白/错误/错误页面,他们试图破解你的网站的错误。)
附录: 当在服务器上完成准备好的语句时,这些限制就是适用的。当编写的语句由库而不是实际作为服务器端模拟时,可能不一样,但通常会模拟其中许多语句。