考虑下面的代码片段。从安全的角度来看,这段代码是否可以接受?假设$action和$data变量被设计为可以接受用户和Register_globals是启用的
<?php
if(common::IsUserAdmin($userID))
{
$isAdmin = true;
}
$data = common::Validate_And_Return_Input($data)
Switch($action)
{
case “add”:
common::addSomething($data);
break;
case “delete”:
if($isAdmin)
{
common::deleteSomething($data);
}
break;
case “edit”:
if($isAdmin)
{
common::editSomething($data);
}
break;
default:
echo “Bad action.”;
}
?>
显然register_globals更适合(安全性方面)。如果可以,禁用它。但是,如果这不是一个选项(遗留系统等),这里有一些反馈。
更改为$isAdmin检查:
// This prevents register_globals from overwriting $isAdmin
$isAdmin = common::IsUserAdmin($userID);
$data = common::Validate_And_Return_Input($data)
// The rest of the code
// ....
开关是过滤掉$action
中不需要的数据的好方法。很好。
另外,如果您希望用户提供一定数量的选项,请对照列表检查它们以确保它们是安全的:
$allowed = array('a', 'b', 'c', 'd');
if (in_array($user_input, $allowed))
{
// Do your stuff. $user_input is safe
}
最后利用类型转换变量,你知道它是(或期望是)整数/浮点数,以确保你得到你所期望的:
$sanitized_input_int = (int)$user_input_int;
$sanitized_input_float = (float)$user_input_float;
由于没有显示任何代码:从安全的角度来看,没有什么需要保护的。所以,只要把它压缩成一个文件,储存起来,让它腐烂10年,直到你删除它。
如果你真的打算在连接到internet的服务器上运行它,你应该遵循PHP手册中建议的最低安全主题,包括禁用全局注册。
如果你最终做到了这一点(还有更多的主题),你甚至可以实际张贴代码的例子,做显示你的一些数据处理,而不是隐藏在后面没有说函数名。验证什么?回到哪里?
实际上,这里没有太多的代码可说,因为这里没有太多的代码。
希望对大家有帮助。