这个问题已经在这里有了答案:




已关闭8年。






我已经做了一些测试,以保护我的网站免受SQL Injection的侵害。我看到有两种方法可以使用户输入转义,添加斜线或更好地使用参数化的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技术?

最佳答案

尝试以下输入:

abc' OR id <> '

这将导致以下陈述:
"SELECT * FROM `Games` WHERE `id` = 'abc' OR id <> ''"

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

出路是在准备好的语句中使用PDO,至少是mysqli_real_escape_string()函数,然后再将用户输入插入SQL语句。

SQL-Injection可以做更多的事情,在最坏的情况下,您甚至可以控制服务器。看看这个SQL Injection Cheat Sheet

关于php - SQL注入(inject)保护-单引号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12863957/

10-12 20:15