关于is_uploaded_file()的,用于防止潜在的攻击者对原本不能通过脚本交互的文件进行非法管理。例如考虑这样一种情况:上传的文件可以立即通过公共网站仓库进行浏览。假如攻击者希望上传某个更有趣的文件,比如/etc/passwd,而不是让他熟读的课堂笔记。攻击者可能不会老老实实地导航到课程笔记文件,而直接在表单的文件上传域中键入/etc/passwd。
<?php
copy($_FILES['classnotes']['tmp_name'], "/www/htdocs/classnotes/".basename($classnotes));
?>
其结果将是/etc/passwd文件被复制到可以公共访问的目录中。就这段话,一开始说是防止攻击者进行非法阅览,但又说攻击者希望上传某个文件而直接在表单文件上传域中键入/etc/passwd,不就自相矛盾了嘛?在上传域键入都只是上传啊。。怎么会变成可以阅览呢?
<?php
copy($_FILES['classnotes']['tmp_name'], "/www/htdocs/classnotes/".basename($classnotes));
?>
其结果将是/etc/passwd文件被复制到可以公共访问的目录中。就这段话,一开始说是防止攻击者进行非法阅览,但又说攻击者希望上传某个文件而直接在表单文件上传域中键入/etc/passwd,不就自相矛盾了嘛?在上传域键入都只是上传啊。。怎么会变成可以阅览呢?
解决方案 »
- 帮看这个.htaccess文件啥意思啊
- 如何在apache环境下获取登陆的用户信息
- 请问哪里有比较稳定的支持PHP5和MYSQL5以上版本的空间
- 网站运行一段时间后,一些目录下出现一些core.*文件,请问是什么?有什么用?怎么用?出现这个正常吗?是否需要使其不出现?如何使其不出现?
- 在PHP中完美实现加密功能(精品)
- 将字符串中的全角字符替换成半角出乱码??
- 对 MySQL 的 SHOW TABLE STATUS
- 请教关于使用session的问题!
- 高分征求正则表达式一个
- 问题:javascript函数中的php如何得到javascipt中的变量?
- 以下这段代码是通过什么加密的,请问用什么可以解密
- PHP 做多线形图
只有一种情况它可能派上用场:
当文件上传失败时, $_FILES['classnotes']['tmp_name']的值为空,那么这时候还可以检测一下 $_FILES['classnotes']['tmp_name'] 是不是一个文件名,显然这会报false,那么你就可以停止移动一个不存在的文件了。
不必纠结于书上这晦涩的论述,自己动手写些例子吧,就比如文件上传
http://php.net/manual/en/function.is-uploaded-file.php
看别人写的注释
首先说明了 is_uploaded_file 函数的作用
其次示例了一个不使用 is_uploaded_file 验证的非法入侵的例子我很怀疑你是否完成了小学学业从编程上讲,很遗憾作者的示例是错误的,不可实现的!
1、表单的文件上传域是只读的,不能键入任何字符
2、$_FILES['classnotes']['tmp_name'] 只在上传确实发生时才会有值
3、$_FILES['classnotes']['tmp_name'] 只是上传文件在服务器上的临时文件名称,由 php 动态构造。并不是表单的文件上传域中的内容
ini_set('max_execution_time', '60'); ob_start('ob_gzhandler');
if (is_uploaded_file($_FILES['fileaddress']['tmp_name'])) {
echo 'File ' . $_FILES['fileaddress']['name'] . ' uploaded successfully.<br />';
echo 'Displaying contents<br />';
readfile($_FILES['fileaddress']['tmp_name']);
}
else {
echo 'Possible file upload attack: ';
echo "filename '" . $_FILES['fileaddress']['tmp_name'] . "'.<br />";
}
?><html>
<head>
<title></title>
</head>
<body>
<form action="index3.php" method="post" enctype="multipart/form-data">
<input type="file" name="fileaddress" />
<p><input type="submit" value="Submit!"/></p>
</form>
</body>
</html>为什么运行会显示
Notice: Undefined index: fileaddress in D:\Apache Group\Apache2\htdocs\PHPProject\index3.php on line 9
Possible file upload attack:
Notice: Undefined index: fileaddress in D:\Apache Group\Apache2\htdocs\PHPProject\index3.php on line 16
filename ''.后面是一个上传域和一个提交按钮。。
你需要加一个判断,是否用户有上传文件
if( isset($_FILES['fileaddress']) && is_uploaded_file($_FILES['fileaddress']['tmp_name'])
为什么上传什么文件上去后在这个路径里都没有显示该文件的?
也许你知道tmp的是临时的缩写,顾名思义 upload_tmp_dir = ";D:\phpTmp\phpUploads" 就是上传文件临时保存到的目录。这个临时文件只会在处理本次页面请求时存在,当程序结束,文件也会被删除。所以你需要把它移动到某一个目录
//ini_set('max_execution_time', '60'); //ob_start('ob_gzhandler');
define("FILEREPOSITORY", "D:/phpFiles/");
if (isset($_FILES['classnotes'])) {
if (is_uploaded_file($_FILES['classnotes']['tmp_name'])) {
if ($_FILES['classnotes']['type'] == "application/pdf") {
echo 'File ' . $_FILES['classnotes']['tmp_name'] . ' uploaded successfully.<br />';
echo 'Displaying contents<br />';
readfile($_FILES['classnotes']['tmp_name']);
$name = $_POST['name'];
//$result = move_uploaded_file($_FILES['classnotes']['tmp_name'], FILEREPOSITORY."/$name.pdf");
$result = copy($_FILES['classnotes']['tmp_name'], FILEREPOSITORY."/$name.pdf");
if ($result !== false) {
echo '<p>File successfully uploaded.</p>';
}
else {
echo '<p>There was a problem uploading the file.</p>';
}
}
else {
echo '<p>Class notes must be uploaded in PDF format.</p>';
}
}
else {
echo 'Possible file upload attack: ';
echo "filename '" . $_FILES['classnotes']['tmp_name'] . "'.<br />";
}
}
else {
echo "Never set!<br />";
}
?><html>
<head>
<title></title>
</head>
<body>
<form action="index3.php" method="post" enctype="multipart/form-data">
Last Name:<br />
<input type="text" name="name"/><br />
Class Notes:<br />
<input type="file" name="classnotes" /><br />
<p><input type="submit" value="Submit!"/></p>
</form>
</body>
</html>
那么为什么上传提交后会没变化(即没有输出,而移动后的最终目标路径中也没有相应文件)?
可 以 在 代 码 开 头 加 上 这 几 句 来 调 试
ini_set('display_errors', 1);
error_reporting( E_ALL | E_NOTICE);
var_dump($_FILES);