6

可能重复:
在 PHP 中防止 SQL 注入的最佳方法?

我一直在做一些测试来保护我的网站免受 SQL 注入。我看到有几种方法可以做到这一点,转义我的用户输入,添加斜杠,或者更好的是使用参数化的 sql 语句。

我有这个测试代码..

$q=$_GET["q"];
$game = mysql_query("SELECT * FROM `Games` WHERE `id` = '$q'");
$game = mysql_fetch_array($game);

echo "<h4>ID: ".$game[0]."<br /></h4>name: " . $game[1];

我尝试了几个 SQLi 请求,但无法让我的测试页面出错,或者显示任何额外的数据。

但是当我将我的 sql 语句代码更改为此(删除了 $q 周围的单引号)..

$game = mysql_query("SELECT * FROM `Games` WHERE `id` = $q");

我可以执行简单的 SQLi 并获得一些结果。

那么将我的用户输入用单引号括起来就足够了吗?或者我是否看过更复杂的 SQLi 技术?

4

3 回答 3

3

您是在提到 SQL 注入和参数化语句,但似乎没有跨 PDO?- 使用 PDO http://www.php.net/manual/en/pdo.prepare.php

于 2012-10-12T17:18:45.843 回答
1

试试这个输入:

abc' OR id <> '

它将导致以下语句:

"SELECT * FROM `Games` WHERE `id` = 'abc' OR id <> ''"

这将返回所有游戏,而不仅仅是一个。如果您的页面允许显示整个结果,那么我们肯定会看到太多......

出路是使用带有预准备语句的 PDO,至少是mysqli_real_escape_string()在将用户输入插入 SQL 语句之前的函数。

SQL 注入可以做更多的事情,在最坏的情况下,您甚至可以控制服务器。看看这个SQL 注入备忘单

于 2012-10-12T17:39:57.143 回答
1

you should use mysql_real_escape_string() function

In this case you have to use the single quotes

 $game = mysql_query("SELECT * FROM `Games` WHERE `id` = '$q'");

let suppose user input is 1' than the escape_string output will be 1\'

if you are not using quotes than the query will be

SELECT * FROM `Games` WHERE `id` = 1'

//that is wrong or a injection

But in the single quotes case

SELECT * FROM `Games` WHERE `id` = '1\''

that is good and can remove the sql-injection

于 2012-10-12T17:14:54.107 回答