【发布时间】:2012-10-12 17:10:48
【问题描述】:
我一直在做一些测试来保护我的网站免受 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 技术?
【问题讨论】:
-
将 PDO 与准备好的语句一起使用。到 2012 年为止,这是更安全的选择。
-
检查你的php服务器是否有
magic_quotes_gpc=ON这将有助于防止SQL注入 -
使用准备好的语句(mysqli 或 POD)。省了很多麻烦,mysql 被弃用了。
-
@jcho360:魔术报价?认真的吗?
-
你错过了一点,即使你努力,你可能已经监督了一些事情。所以实际上更有用的是,使用一个库来处理这个问题,并且由更多的程序员编写和审查,而不仅仅是你。请参阅我刚刚链接的相关问题。
标签: php mysql sql-injection