【问题标题】:Does $_GET['param_name'] potentially trouble maker with array returning?$_GET['param_name'] 是否会在数组返回时造成麻烦?
【发布时间】:2012-03-13 17:52:12
【问题描述】:

我是 PHP 新手,这个问题似乎很愚蠢。

但我真的对关联数组 $_GET 感到困惑,它可以帮助我访问通过 URL 发送的所有参数。

假设我期待一个 product_ID 字符串,并在代码中这样写:

$id = $_GET['prod_id'];
Get_Data($id);

而 Get_Data() 是一个函数,它期望唯一的参数是字符串,而不是数组。 如果一些坏人在网址中输入类似这样的内容怎么办:

.../product.php?prod_id[]=1&prod_id[]=2

使用$_GET['prod_id'] 的方法将返回一个数组(1,2) 而不是字符串。这可能会在我的应用程序中导致一些非常糟糕的问题。

现在,问题是:有没有一种全局方法可以避免上述情况?


[编辑]

有时我想从 $_GET['prod_id'] 获取数组而不是字符串(例如:从多选框获取数据,用户可以在其中选择超过 1 个产品)

我是否可以检查返回的数组是否具有正确的结构(一维数组,带有无辜数据)或被这样的坏人欺骗:

.../product.php?prod_id[a]=1&prod_id[b]=2&prod_id[c]=3&prod_id[d]=4

我认为将具有复杂结构的数组传递给 php $_GET 非常容易,但对于编码人员来说很难检查它是否是他们需要的正确结构。

你能告诉我吗?谢谢!

【问题讨论】:

  • 用技术术语来说,如果有人破解了 url 以将该参数更改为数组表示法,那么您将数组传递给您的函数。根据您使用该值的方式,它可能会自动转换为简单地说 Array 的字符串。

标签: php arrays get


【解决方案1】:

答案是:验证

通常使用filter_input() 函数。

http://ca3.php.net/filter

如果有时您希望它是一个数组,请使用条件 if (is_array($_GET['prod_id'])) 并使用不同的验证集。

【讨论】:

  • 真的真的非常感谢你!你带我从狭窄的小路到高速公路!
【解决方案2】:

如果在 URL 中提交了一个数组,那么当通过$_GET 检索时,它将是一个 PHP 数组,而不是一个看起来像序列化数组的字符串。

// Inside a form performing a get request:
// [] on a name makes it an array:
<input type='checkbox' name=arr[] value='chk1' />
<input type='checkbox' name=arr[] value='chk2' />

// Dumps an array, rather than a serialized string
print_r($_GET['arr']);

所以在你的第一种情况下:

$id = $_GET['prod_id'];
Get_Data($id);

始终验证您的输入数据:

您应该验证$id 的内容是否在您期望的范围内,如果您在它实际上是一个数组时尝试将其用作字符串,则作用于它的函数将引发警告或错误。由于 PHP 是弱类型的,如果你传递一个数组,一个期望整数的函数会很高兴地运行,但可能会崩溃并在你的日志或屏幕上显示错误。

// Make sure $id is an int
if (!ctype_digit($id)) {
  // invalid data, abort!
}

另一方面,如果值是一个数组:

if (!is_array($_GET['prod_id'])) {
  // it wasn't an array, abort!
}

【讨论】:

    【解决方案3】:
    $id = str($_GET['prod_id']);
    

    将变量类型转换为字符串文字。

    【讨论】:

    • 他似乎想验证数组及其值,而不是尝试强制转换。
    • 是的,重读 OP 的帖子让我产生了同样的想法。我认为迈克尔有他想要的答案。
    【解决方案4】:

    使用验证,类似这样:

    $id = (!isset($_GET['prod_id'])) ? null : $_GET['prod_id'];
    if (intval($id) > 0) {
       //...
    }
    #OR
    if (is_int($id) > 0) {
      //...
    } 
    

    【讨论】:

      猜你喜欢
      • 2017-01-26
      • 2012-03-11
      • 1970-01-01
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 2016-07-16
      • 2022-07-22
      • 1970-01-01
      相关资源
      最近更新 更多