我理解它,因为该功能可以对抗
$_FILES['nn']['tmp_name']
这个tmp_name是由php在服务器上创建的,不能(根据我的理解)被客户端操纵。函数is_uploaded_file()在什么意义上添加安全性?
消息来源代码:
/* {{{ proto bool is_uploaded_file(string path)
Check if file was created by rfc1867 upload */
PHP_FUNCTION(is_uploaded_file)
{
char *path;
size_t path_len;
if (!SG(rfc1867_uploaded_files)) {
RETURN_FALSE;
}
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_STRING(path, path_len)
ZEND_PARSE_PARAMETERS_END();
if (zend_hash_str_exists(SG(rfc1867_uploaded_files), path, path_len)) {
RETURN_TRUE;
} else {
RETURN_FALSE;
}
}
答案 0 :(得分:4)
这是我能找到的最好的信息......
根据Chris Shiflett的Essential PHP Security一书:
如果您的代码使用tmp_name而未验证它实际上是上传的文件(而不是/ etc / passwd),存在理论风险。我将此称为理论风险,因为没有允许攻击者修改tmp_name 的已知漏洞。但是,不要让漏洞无法阻止您实施一些简单的保护措施。
然而,请记住,这是2005年10月20日发布的。我不知道任何已经浮出水面的漏洞,或者围绕着"理论"利用是。他也谈到了它here。
security stack exchange上有一个类似的问题需要进一步参考。
答案 1 :(得分:1)
这对程序员你来说实际上是一种健全性检查。没有任何用户("黑客")可以做的事情会使tmp_name
引用除刚刚上传的文件之外的任何内容。但是,在您的代码中,您可能会以复杂的方式传递文件名;为了避免在这种情况下出现编程错误,is_uploaded_file
为您提供了一个工具来检查您是否真正使用刚刚上传的文件,或者您是否正在尝试使用其他一些文件。在后一种情况下,如果您的代码[在某些情况下]错误地使用任何文件而不是仅仅上传文件,则攻击者可能能够利用该错误并获得访问权限对文件他们不应该。