停止sql注射的最佳方法?

时间:2013-09-16 02:05:56

标签: php mysql sql pdo

我的问题是如何成为一个试图进行SQL注入的人最烦人的事情,我可能并没有真正表达出我想要做的事情,并在我写的内容中寻找。

感谢大家提前帮助。我正在努力学习MySQL。我打算建立一个数据库来练习,但我在这里阅读并寻找示例,并不断看到人们说他们将在哪里获得SQL注入。

我已经读了一段时间了,我读的越多越混乱。我决定使用PDO来防止这种情况发生。即使从我读到的内容中,准备好的语句也使其安全,我仍然需要将其列入白名单。

我的问题是,如果有人可以给像我这样的初学者一个我们可以使用的设置,这将非常有效地阻止这些攻击。根据我的理解,似乎几乎不可能阻止他们,我看到有人说dns是唯一确定的方式。我想学习以正确的方式做到这一点,即使我现在可能不需要太多的安全性。

如果我没有错,即使您使用PDO,他们仍然可以使用盲注。如果是这样,我想添加2-5秒的延迟或类似的东西。我不知道用户端是否过多,我只是在学习,没有真正的世界经验。

此外,我将要做的事情,现在可能是非常基本的...妈妈&流行类型的东西。如果我建立一个拥有用户名和密码的网站,我不希望他们得到这些攻击,我只是不喜欢它。因此,如果它有点慢但更安全,我希望至少能够给他们这个选择。我的想法是让他们真的很讨厌,希望不值得。

从我读到的还有表名或用户名的长度可以使他们更难,比如用短语而不是6-8个字母。

此外,我认为最小特权也会有所帮助,但似乎总有办法绕过一切,如果你是新人并且不确切知道你在做什么,那么你就会变得脆弱。

我从某个地方复制了代码,我将根据自己的需要调整代码,但我还没有尝试将我正在寻找的内容整合在一起,仍处于阅读和学习阶段。

<?php


require_once "dBug!.php";

$dsn = "mysql:host=";
$user_name = "";
$pass_word = "";

$connect = new PDO($dsn, $user_name, $pass_word);

$sql = "SELECT * FROM books WHERE id <= 10";   

$result = $connect->prepare($sql);

$status = $result->execute();


if (($status) && ($result->rowCount() > 0))
{
$results = array();


while ($row = $result->fetch(PDO::FETCH_ASSOC))
{
    $results[] = $row;
}


new dBug($results);

}

$connect = null;


?>

1 个答案:

答案 0 :(得分:0)

停止SQL注入攻击的最佳方法是使用存储过程。为此,需要编写存储过程,以便不将用户输入作为SQL代码提交,而是将SQL语句中的变量值作为服务器上已存在的值提交。