用户提交的数据

许多 PHP 程序的最大弱点不在于语言本身,而仅仅是代码在编写时没有考虑安全问题。出于这个原因,你应该始终花时间考虑一段代码的含义,以确定如果提交了意外变量会造成可能的损害。

示例 #1 危险的变量使用

<?php
// 从用户的 home 目录中删除一个文件...或者可能是
// 其他人的?
unlink ($evil_var);

// 记录他们的访问...或者可能是 /etc/passwd 的条目?
fwrite ($fp, $evil_var);

// 执行一些琐碎的事情... 或者 rm -rf *?
system ($evil_var);
exec ($evil_var);

?>

你应该始终仔细检查你的代码,确保从 Web 浏览器提交的任何变量都经过适当的检查,并问问自己以下问题

  • 这个脚本只会影响目标文件吗?
  • 可以对不寻常或不希望的数据进行操作吗?
  • 这个脚本可以以意想不到的方式使用吗?
  • 这个脚本可以与其他脚本结合使用以产生负面影响吗?
  • 任何交易都会得到充分记录吗?

通过在编写脚本时充分提出这些问题,而不是事后才提,你可以避免在需要提高安全性时不幸地重写代码。从一开始就怀着这种心态,你并不能保证系统的安全性,但可以帮助提高安全性。

你可能还想考虑关闭 register_globals、magic_quotes 或其他可能让你对给定变量的有效性、来源或值的了解感到困惑的便利设置。在 error_reporting(E_ALL) 模式下使用 PHP 也可以帮助你警告你在检查或初始化之前使用的变量(以便你可以防止对不寻常的数据进行操作)。

添加备注

用户贡献的备注 2 个备注

Uli Kusterer
18 年前
我想在这里重复的一点是,哪些信息实际上来自用户。许多人认为 Cookie 是安全的,因为它是由 PHP 写入的。但事实是,它存储在用户的计算机上,由用户的浏览器传输,因此很容易被操纵。

因此,在这里再次提到这一点会很有帮助

URL 中的 CGI 参数、HTTP POST 数据和 Cookie 变量被视为“用户数据”,因此需要验证。会话数据和 SQL 数据库内容只有在来自不可信来源(比如上面提到的那些)时才需要验证。

这不是什么新鲜事,但我原本以为这些信息会出现在这个标题下,至少作为简短的回顾加上实际文档的链接。
Livingstone@stonyhills[dot]com
16 年前
确保你的表单是从你的页面提交的!也可以通过在查询字符串中添加 &token 并使用 $_GET 检查此值与会话数据(或你喜欢的任何数组)进行比较来适应 URL,注意这个字符串是随机生成的并存储的。如果你不想使用 $_SESSION,可以创建自己的数组来存储生成的字符串,例如 $tokens = array(),并在你的 easysecure 类中存储该数组中的所有内容!

<?php

class easysecure {

var
$curr_user;
var
$curr_permission;
var
$curr_task;
var
$validpermission;
var
$error;


function &
setVar( $name, $value=null ) {
if (!
is_null( $value )) {
$this->$name = $value;
}
return
$this->$name;
}

function
maketoken($formname, $id){

$token = md5(uniqid(rand(), true));

$_SESSION[$formname.$id] = $token;

return
$token;
}

function
checktoken($token, $formname, $id){
//print_r($_SESSION);
//echo ($token);
//如果我们没有有效的 token,返回无效;
if(!$token){
$this->setVar('validpermission', 0);
$this->setVar('error', '未找到 token,检测到安全漏洞');
return
false;
}

//如果我们有一个有效的 token,检查它是否有效
$key = $_SESSION[$formname.$id];
if(
$key !== $token ){
$this->setVar('validpermission', 0);
$this->setVar('error', '无效 token');
return
false;
}

if(
$this->validpermission !==1){
echo
'没有有效的权限来运行此脚本';
return
false;
}else{
return
true;
}
}

}

?>

<?php $userid = *** //设置你喜欢任何 ID?>
<form name="newform" action="index.php" method="post">
<input type="text" name="potentialeveilfield" value="" size 30 />
<input type="hidden" name="token" value="<?php echo maketoken(newform, $userid); //$userid 可以是用户资料 ID?>" />
<input type="submit" />
</form>

现在,在处理表单时... 检查 token 的值

<?php

// 当然,您知道表单的名称
if(!checktoken($_POST['token'], 'newform', $userid))
{
// 失败
exit(); // 或者任何适合您的终止和通知方法。
To Top