【问题标题】:SQL Injection Protection - single quotes [duplicate]SQL 注入保护 - 单引号 [重复]
【发布时间】:2012-10-12 17:10:48
【问题描述】:

可能重复:
Best way to prevent SQL injection in PHP?

我一直在做一些测试来保护我的网站免受 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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    试试这个输入:

    abc' OR id <> '
    

    这将导致以下语句:

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

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

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

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

    【讨论】:

    • 嗨,我刚刚尝试了该输入,但没有返回任何内容。我尝试了很多类似的结果并得到了相同的结果,因此我问单引号是否足够。会不会是@jcho360 提到的阻止这些攻击的magic_quotes_gpc=ON
    • @user1741863 - 这是可能的,你可以很容易地检查它,只需创建一个调用phpinfo();的php页面并搜索magic_quotes_gpc。我必须做一个演示并创建一个页面,您可以在其中play with SQL-Injections,不幸的是它是德语的。
    • 确实开启了。感谢页面,谷歌翻译救援。
    【解决方案3】:

    你应该使用mysql_real_escape_string()函数

    在这种情况下,您必须使用单引号

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

    假设用户输入为1',而escape_string 输出为1\'

    如果您不使用引号,则查询将是

    SELECT * FROM `Games` WHERE `id` = 1'
    
    //that is wrong or a injection
    

    但是在单引号的情况下

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

    这很好,可以删除sql-injection

    【讨论】:

    • mysql_* 已弃用,将在未来版本中删除。
    • @itachi 别太聪明了。正确查看问题properly..Escaping my user inputs, adding slashes, or better yet using parameterized sql statements....
    • 反对票与问题无关,与答案无关。它不应该是它的方式吗?您使用了已弃用的功能。因此,这个答案在我看来缺乏完整性,因此不赞成。
    • @itachi 我认为你应该好好检查你的眼睛......
    • 这个方法仍然有效,是迄今为止最好的方法。不要给这个用户投反对票。当这个功能被删除时再做
    猜你喜欢
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 2015-08-20
    • 2012-08-27
    • 1970-01-01
    • 2021-10-23
    • 2013-02-19
    • 2011-09-15
    相关资源
    最近更新 更多