代码之家  ›  专栏  ›  技术社区  ›  caesay

PHP中MySQL查询的过滤

  •  2
  • caesay  · 技术社区  · 14 年前

    嘿,我正在对一个MySQL数据库进行一些查询,其中包含一些用户输入。。我想知道如何防止注射攻击,例如,如果有人要打字

    "; a-MySQL query here;"
    

    它将被执行,这将允许人们访问我的系统。我想知道我怎样才能避免这样的情况,可能创建一个函数来过滤掉查询中的错误语句?或者不允许;性格?

    总而言之:

    • 现在常用的预防注射攻击的方法是什么?
    3 回复  |  直到 14 年前
        1
  •  3
  •   Community kfsone    7 年前

    唯一的方法是正确地转义用户提交的数据。其他人指出了一些这样做的方法。

    还有另一种方法: 准备好的报表 和占位符。准备好的陈述得到每个人的支持 现代的 PHP数据库接口,包括 mysqli PDO .

    让我们用PDO作为演示。假设我们想更新表中的一些数据 foo

    $sql = 'UPDATE foo SET bar = ? WHERE user_id = ?';
    $sh = $db->prepare($sql);
    $sh->execute(array( $_POST['bar'], $_SESSION['user_id'] ));
    

    数组中的变量传递给 execute 自动转义和引用 . 您不需要手动对它们进行转义,以使它们安全地放入数据库!

    另一方面,您仍然需要对它们进行筛选,以查找意外的内容,如HTML、Javascript、需要数字的字母等。使数据安全地插入数据库是非常重要的 only half of the battle .

        2
  •  2
  •   Ross Snyder    14 年前

    mysql_escape_string 变体是在PDO中使用绑定查询,这样就不可能忘记或错过一个案例,因为PDO会在情况需要时为您进行转义。

    有关更多信息,请参阅: http://www.electrictoolbox.com/php-pdo-bound-placeholders/

        3
  •  1
  •   Marco Ceppi    14 年前

    他们最好的解决方案是通过这个函数运行来自wild(用户)的每一条输入 PHP.net: MySQL Real Escape String 这将解决今天看到的大多数(如果不是全部)注射问题。您只需执行以下操作:

    $var = mysql_real_escape_string($_GET['var']);
    $query = "INSERT INTO foo (var) VALUES (\"$var\");
    

    $id = (INT)$_GET['id'];

    $id = ( is_numeric($_GET['id']) ? (INT)$_GET['id'] : -1; // replace -1 with FALSE, or NULL, etc

    这将强制该变量为整数,这样您就不会 $id 是“foo”或其他非数字的。