2013-04-05 82 views
0

我正在阅读关于php安全性的一本书,并且在输入验证章节中有一小节讨论只允许预期的输入。这是什么意思,只允许预期的输入在PHP?

这是他们展示这些代码:

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

我有点糊涂了,有一个小段落,解释这段代码的功能。对于我所得到的,它将数组中的值作为$ _POST的键值。它还表示该阵列应该以编程方式从GPC阵列中复制完成。

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

+0

恕我直言,你应该把这本书扔在垃圾桶里。它是在1999年写的吗?上面的代码不会销毁$ _POST数组,所以你可能会在不经意的情况下意外使用它;它会将所有变量转储到该代码所放入的任何名称空间中。更好的方法是查看$ _POST数组,并使列表中的值不在列表中。甚至更好的办法是将这些值放入一个新的数组/对象中并销毁原始数据。 – DampeS8N 2013-04-05 19:53:08

+0

// @ DampeS8N哦真的吗?我不知道!你有没有机会知道更新的书?或者可能是我可以了解该主题的链接。感谢您的评论,这本书来自几年前,但我不知道它会指向错误的方式。 – Ant100 2013-04-07 14:30:05

+0

这个网站是一个很好的开始。答案中的一些链接也很好。一般来说,我建议不要从书中学习。但我知道有些人从他们身上学到更好。 – DampeS8N 2013-04-07 18:04:58

回答

0

该代码根据$_POST数组中的数据创建变量。变量的名称取自$_POST数组的键。 PHP调用它(即动态地命名变量)variable variables

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

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

我的建议是远离变量变量,而不是仅通过$_POST数组访问POST值。这就明确了价值来自哪里,因此如果以不安全的方式处理这样的价值就更容易发现。

+0

非常感谢您的回答!我现在明白了。我会看看变量变量,因为我不知道它们,但我也会遵循你的建议。 – Ant100 2013-04-05 18:26:42

1

GPC =获取发布Cookie,它指的是来自用户/浏览器的变量。因此,而不是使用$ _GET,$ _POST,$ _COOKIE,您应该清理并验证数据到您可以信任并且清楚的变量中。

至于建议,他们正在做的是限制你的代码访问。在上面的代码示例中,您可能会在页面上使用名为carMOdel,year和bodyStyle的元素。这里的代码是限制你的代码只与这3个元素交互。

这可以防止某人向您的页面传递额外参数,以尝试注入代码或某种SQL注入攻击或任何其他数量的东西。在这样一个简单的例子中,它可能没有意义。但有些情况下,人们正在采取form/api请求,并在GPC阵列中的所有内容上运行循环,并在其中执行任何操作。我建议不要这样做。

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

就安全性而言,OWASP是一个很好的学习来源。 here是一个小工具表,是在为php工作。

+0

感谢Nathan Hess的解释! +1为链接:) – Ant100 2013-04-05 18:27:33

0

它也表示应该以编程方式将数组拷贝出GPC阵列。

这可能意味着你不一定写:

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

而是写类似:

$expected = getExpectedInput('carForm'); 

凡功能getExpectInput将在数据库中查询输入,应在形式'carForm'。或者也许它可能在一个文件中,并且这个函数会获取该内容。他们的基本意思是,在表单中硬编码变量不是一个好主意。而是把它们写在某个地方,这样它们很容易改变。如果您曾对窗体进行过更改并添加了变量或更改了变量名称,则不必更改此特定代码。这意味着此功能可用于不同的形式。这个想法是编写可重用的函数。不是那些致力于一件事的人。 OOP。

getExpectedInput函数可能会返回一个数组。无论你喜欢什么,或者使用任何方法,你都可以命名。

+0

感谢您的回答! – Ant100 2013-04-05 18:28:18