【问题标题】:PHP - Capturing the $_GET method safelyPHP - 安全地捕获 $_GET 方法
【发布时间】:2019-04-10 20:09:28
【问题描述】:

我最近开始学习 PHP 和 PDO。长期目标是能够在数据库中的单个details.php 页面上动态显示内容,使用$_GET 方法捕获?page=id 或某种变体。

为了比较?page=id,我的计划是将其保存到一个变量($pageId 或其他东西)并将该变量与数据库中的记录进行比较。如果记录存在,请获取该记录,但我对准备好的语句有点犹豫。

当我使用 get 方法获取 ?page=id 时,我会使用准备好的语句来开始查询,但是在处理查询之前我是否应该做任何事情来清理我正在记录的内容?

【问题讨论】:

  • $_GET 是一个变量,而不是一个方法。有成千上万的教程展示了如何做一个准备好的陈述。我看到的唯一问题的答案是“这取决于”。出于安全目的,准备好的语句将保护您免受任何恶意值的影响,并且不需要“清理”。出于业务逻辑目的,谁知道呢?

标签: php database pdo get


【解决方案1】:

当使用 PDO 准备语句绑定来自用户输入的值或变量时,您不需要需要清理输入(以防止查询中的 SQL 注入)。但是,最好尽可能限制其内容。

例如,假设id 输入将是一个整数,您可以使用:

$getId = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT);

https://www.php.net/manual/en/function.filter-input.php

现在你确定它是一个整数。

此外,您可以将其限制为有效整数,例如:

if (($getId > 0) && ($getId < PHP_INT_MAX)) {
   .... proceed ....
}

换句话说,总是尽可能地限制用户输入

【讨论】:

  • 我不会仅仅依靠 filter_input。 echo filter_var('2plus2is4', FILTER_SANITIZE_NUMBER_INT); 给了224,我怀疑filter_input() 的行为不同(但说实话还没有检查过)。 IMO 至少在需要 filter_input() 之前检查 is_numeric()is_int()
  • @Jimmix 虽然,你说的有些道理,但最终它没有。我真的不在乎有效整数 224 是来自参数值 2plus2is4 还是来自 224。真的没关系。只要 22​​4 有效,我就可以接受。
【解决方案2】:

您可以使用 php 清理函数来清理带有 GET 参数的任何数据。 例如,您的 $_GET 值等于 123,并且您想要过滤和清理它。 利用: $number = $_GET['number']; filter_var($number, FILTER_SANITIZE_NUMBER_INT);

或者您可以通过以下方式检查来自 $_GET 的值是否为数字且 > 0:

$number = $_GET['number'];
if(is_int($number) && $number > 0) {
  //start to check with database.
}

【讨论】:

  • 虽然没有错(我没有投反对票),但这个答案并不完整。请查看@KIKOSoftware 的答案
【解决方案3】:

sanitize functions。请记住,如果您将任何用户传递的信息保存到日志中,然后在浏览器中显示(即通过使用管理面板),那么有人可能会传递给您浏览器将执行的恶意 javascript。如果浏览器登录到管理面板,这可能会导致安全问题。

如果你问这样的问题,我会指导你也去OWASP 熟悉其他安全风险。

还有 google 的 Sanitization 和 Validation 的区别。

here 是您可能会觉得有用的一些过滤器函数,但不要只依赖它们。例如,一个有效的id 数字传递过滤函数可能是123,但也可能是1e5,这在数字方面是有效的,但对于id 在行@ 的情况下无效987654330@ 通常。另一件事是,一些数字可能使用. 来分隔小数,但其他数字使用,,两者都有效,具体取决于国家和这些符号的财务解释。在某些县,. 是千位分隔符,因此 1k = 1.000。 这就是为什么您不应该 100% 转发过滤器函数,而是将它们视为您自己函数的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    相关资源
    最近更新 更多