Php 上传的文件如何增加安全性?
我的理解是,该函数与Php 上传的文件如何增加安全性?,php,security,Php,Security,我的理解是,该函数与 $_FILES['nn']['tmp_name'] 这个tmp_名称是由php在服务器上创建的,并且(据我所知)不能被客户端操纵。函数在什么意义上是\u上传的\u file()增加了安全性 源代码: /* {{{ proto bool is_uploaded_file(string path) Check if file was created by rfc1867 upload */ PHP_FUNCTION(is_uploaded_file) { cha
$_FILES['nn']['tmp_name']
这个tmp_名称是由php在服务器上创建的,并且(据我所知)不能被客户端操纵。函数在什么意义上是\u上传的\u 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;
}
}
这是我能找到的最好的信息 根据Chris Shiflett的《基本PHP安全》一书: 如果您的代码使用tmp_名称,而没有验证它实际上是上载的文件(而不是像/etc/passwd这样的文件),理论上存在风险。我将此称为理论风险,因为没有已知的漏洞允许攻击者修改tmp_名称。但是,不要让漏洞的缺乏阻止您实施一些简单的保护措施 但是,请记住,这是2005年10月20日发布的。我不知道此后出现了任何漏洞,也不知道围绕“理论”漏洞的细节是什么。他也谈到了这一点
还有一个类似的问题供进一步参考。这实际上是对程序员的一个理智检查。任何用户(“黑客”)都无法使
tmp\u name
引用除刚刚上传的文件以外的任何内容。然而,在代码中,您可能以复杂的方式传递文件名;为了避免在这种情况下出现编程错误,is\u uploaded\u file
为您提供了一个工具,用于检查您是否正在使用刚刚上载的文件,或者是否正在尝试使用其他文件。在后一种情况下,如果您的代码[在某些情况下]错误地处理任何文件而不是仅上载的文件,则攻击者可能会利用该错误获得不应该访问的文件。您的意思是?@mistermartin是的。在不篡改实际php脚本的情况下,远程客户端如何成功地(从手册中):“诱使脚本处理它不应该处理的文件——例如,/etc/passwd”Ok。我想我明白了。黑客可以尝试发送包含绝对路径的文件,例如“/etc/password”。浏览器不允许这样做,但黑客可以操纵请求,在www用户安全性不好的情况下,php可以通过查看绝对路径而不理解它是路径而不是文件名来覆盖文件。这可能应该在php中更正。我无法解释源代码。感谢所有的澄清。看着,Jon指出这个函数是无用的。我仍然很好奇,如果函数查看的是“name”,而不仅仅是“tmp_name”,而且浏览php源代码都超出了我的舒适范围。@user247245手册中说:“为了正常工作,函数是上传的文件()
需要像$\u FILES['userfile']['tmp_name'这样的参数。”
,-客户端计算机上上载文件的名称$\u FILES['userfile']['name']
不起作用”。