【问题标题】:Is it necessary to validate $_GET id是否有必要验证 $_GET id
【发布时间】:2013-05-02 03:21:09
【问题描述】:

我确定以前有人问过这个问题,但我找不到类似的帖子。

验证来自 $_GET 变量的 ID 字段的必要性有多大? 我正在使用 is_numeric() 来确保我至少得到一个数字,但我只是在输入不必要的代码吗?

例如。

www.test.com/user.php?user_id=5

if (isset($_GET['user_id']) && is_numeric($_GET['user_id'])) {
  *PDO query for user information*
}

is_numeric() 有必要吗?
是否有可能通过更改地址中的 user_id 进行攻击?

【问题讨论】:

标签: php html mysql pdo


【解决方案1】:

如果你不想使用准备好的语句,PDO::quote 应该是正确的函数:

返回一个带引号的字符串,理论上可以安全地传递给 SQL 语句。

【讨论】:

    【解决方案2】:

    如果你想在执行查询之前正确验证一个整数,你应该使用filter_input();结果是一个有效的整数,false 如果它不是一个有效的整数,或者null 如果参数根本没有传递。

    if (is_int($userId = filter_input(INPUT_GET, 'user_id', FILTER_VALIDATE_INT))) {
      *PDO query for user information*
    }
    

    如果您使用准备好的语句,这并不重要,但如果您希望根据输入是否符合预期返回失败响应,您可以使用上述。

    【讨论】:

      【解决方案3】:

      is_int 检查变量的类型。但是 $_GET['id'] 将始终是一个字符串。最好使用filter_var

      但无论如何你都必须使用准备好的语句。

      附:使用准备好的语句,您不能使用验证。 DB 会告诉我们什么也没找到。但是如果你想警告用户错误的请求,你必须在查询之前验证它。

      【讨论】:

      • 为了检查ID是否为int,代码不会更短吗?我只是想确保链接没有被篡改
      • @Soujirou,阅读关于 is_int 的第一条评论。关于“篡改”......你不能确定这一点。如果即使 id 也是有效数字。如果 ID 是有效数字,你想做什么?
      【解决方案4】:

      清理数字 id 的最佳方法是使用 (int) 演员表。

      $id = (int) $_GET['ID'];
      

      只是永远不知道的字符串。

      is_int() 有必要吗?

      您可能正在寻找按 id 检索数据。因此,将字符串转换为int 是最简单的方法。附注is_int will always return false 如果应用于字符串。

      是否有可能通过更改地址中的user_id进行攻击?

      嗯,字符串总是。您永远不知道用户可能输入了哪些奇怪的字符以及这将如何影响查询。例如,我不知道它是否可以应用在这种情况下,但是你应该看看NULL bytes attacks

      【讨论】:

      • 我注意到如果 $_GET['id'] 不存在, (int)$_GET['id'] 将不会传递任何东西。 if (isset($_GET['id']) && (int)$_GET['id'])
      • @Soujirou,你说的通过是什么意思?
      • 对不起,当我按下回车键时我没有完成我的句子。我想传递一个 T/F 值,所以如果 ID 是 int,那么我可以进行查询。
      【解决方案5】:

      is_int 不起作用,因为GET 变量总是作为字符串传递。

      就个人而言,我喜欢使用以下方法测试有效整数:

      if(strval(intval($_GET['user_id'])) === $_GET['user_id'])
      

      但是,这可能有点矫枉过正。毕竟,如果您使用准备好的语句,则无需处理任何转义,并且搜索不存在的行将不会返回任何结果。我会输入intval($_GET['user_id']),但只是为了让未来的编码人员真正清楚ID是一个数字。

      【讨论】:

      • 拒绝不好的请求是有好处的。顺便说一句,那个整数测试只是伤害了我的眼睛 ;-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 2013-12-25
      • 2023-03-15
      • 1970-01-01
      • 2011-10-29
      • 2021-06-13
      相关资源
      最近更新 更多