0

我正在阅读一本关于 php 安全性的书,在输入验证章节中,有一小部分讨论了只允许预期的输入。

这是他们显示的代码:

<?php
$expected = array( 'carModel', 'year', 'bodyStyle' );
foreach( $expected AS $key ) {
if ( !empty( $_POST[ $key ] ) ) {
${$key} = $_POST[ $key ];
}
else {
${$key} = NULL;
}
}
?>

我有点困惑,有一小段解释了代码的作用。对于我得到的,它从数组中分配一个值作为 $_POST 的键。它还说该数组应该以编程方式从 GPC 数组中复制出来。

我不明白的是我应该在什么情况下使用它?什么是 GPC 阵列?

4

3 回答 3

1

GPC = Get Post Cookie,它指的是来自用户/浏览器的变量。因此,不要使用 $_GET、$_POST、$_COOKIE,您应该将数据清理并验证到您可以信任并知道是干净的变量中。

至于建议,他们正在做的是限制您的代码可以访问的内容。在上面的代码示例中,您可能会在页面上有一个表单,其中包含名为 carMODEl、year 和 bodyStyle 的元素。这里的代码正在做的是将您的代码限制为仅与这 3 个元素交互。

这可以防止有人向您的页面传递额外的参数以尝试注入代码或某种 SQL 注入攻击或任何其他数量的事情。在像这样的简单示例中,它可能没有意义。但是在某些情况下,人们正在接受表单/api请求并在一个 GPC 阵列中的所有内容上运行循环,并在其中处理任何内容。我建议不要一开始就这样做。

这只是保护您的服务器/数据库的许多事情之一。在开发 web 应用程序时,您应该采取不信任来自用户端的立场。

就安全性而言,OWASP 是一个很好的学习资源。是一个用于 php 的小备忘单。

于 2013-04-05T17:49:30.023 回答
0

$_POST代码从数组中的数据创建变量。变量的名称取自$_POST数组的键。PHP 调用这个(即动态命名变量)变量 variables

这通常是一个坏主意,因为您无法控制$_POST数组中存在哪些键,以及创建了哪些变量。您网站的用户对此进行控制。恶意用户可能会以这样的方式命名 POST 变量,从而覆盖您打算用于不同目的的变量。

该书建议允许数组中的键以受控方式$_POST覆盖变量。这就是为了。此代码和以下代码仅创建变量和。例如,如果用户向您的应用程序发帖,则不会创建值为 1的变量。$expected = array('carModel', 'year', 'bodyStyle')$carModel$year$bodyStylecurrent_user_has_admin_rights=1$current_user_has_admin_rights

我的建议是完全远离变量变量,而是$_POST仅通过数组访问 POST 值。这清楚地表明了值的来源,因此更容易发现这样的值是否以不安全的方式处理。

于 2013-04-05T17:49:31.840 回答
0

它还说该数组应该以编程方式从 GPC 数组中复制出来。

这可能意味着您不一定要写:

$expected = array('carModel', 'year', 'bodyStyle');

而是写一些类似的东西:

$expected = getExpectedInput('carForm');

函数 getExpectInput 将在数据库中查询应为“carForm”形式的输入。或者它可能在一个文件中,这个函数会获取那个内容。它们基本上意味着,在表单中硬编码变量不是一个好主意。而是将它们写在某个地方,以便它们易于更改。如果您曾经更改过表单并添加了变量或更改了变量名,则不必更改此特定代码。这意味着此功能可用于不同的表格。这个想法是编写可以重用的函数。不是那些专注于一件事的人。哎呀。

getExpectedInput 函数可能会返回一个数组。您可以随意命名或使用任何方法。

于 2013-04-05T17:54:17.727 回答