这个问题已经在这里有了答案:
已关闭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/