当前位置:首页 » 文件管理 » php安全的文件上传

php安全的文件上传

发布时间: 2022-12-20 03:19:49

❶ 怎样用php实现文件上传

创建一个文件上传表单
允许用户从表单上传文件是非常有用的。
请看下面这个供上传文件的 HTML 表单:
<html>
<body>

<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>

</body>
</html>

请留意如下有关此表单的信息:
<form> 标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 "multipart/form-data"。
<input> 标签的 type="file" 属性规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。
注释:允许用户上传文件是一个巨大的安全风险。请仅仅允许可信的用户执行文件上传操作。
创建上传脚本
"upload_file.php" 文件含有供上传文件的代码:
<?php
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Stored in: " . $_FILES["file"]["tmp_name"];
}
?>

通过使用 PHP 的全局数组 $_FILES,你可以从客户计算机向远程服务器上传文件。
第一个参数是表单的 input name,第二个下标可以是 "name", "type", "size", "tmp_name" 或 "error"。就像这样:
$_FILES["file"]["name"] - 被上传文件的名称
$_FILES["file"]["type"] - 被上传文件的类型
$_FILES["file"]["size"] - 被上传文件的大小,以字节计
$_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
$_FILES["file"]["error"] - 由文件上传导致的错误代码
这是一种非常简单文件上传方式。基于安全方面的考虑,您应当增加有关什么用户有权上传文件的限制。
上传限制
在这个脚本中,我们增加了对文件上传的限制。用户只能上传 .gif 或 .jpeg 文件,文件大小必须小于 20 kb:
<?php

if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Stored in: " . $_FILES["file"]["tmp_name"];
}
}
else
{
echo "Invalid file";
}

?>

注释:对于 IE,识别 jpg 文件的类型必须是 pjpeg,对于 FireFox,必须是 jpeg。
保存被上传的文件
上面的例子在服务器的 PHP 临时文件夹创建了一个被上传文件的临时副本。
这个临时的复制文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位置:
<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
}
else
{
echo "Invalid file";
}
?>

上面的脚本检测了是否已存在此文件,如果不存在,则把文件拷贝到指定的文件夹。
注释:这个例子把文件保存到了名为 "upload" 的新文件夹。

❷ php上传文件到服务器

1、通过PHP,可以把文件上传到服务器。创建一个文件上传表单,下面这个供上传文件的 HTML 表单:

<html>
<body>

<formaction="upload_file.php"method="post"
enctype="multipart/form-data">
<labelfor="file">Filename:</label>
<inputtype="file"name="file"id="file"/>
<br/>
<inputtype="submit"name="submit"value="Submit"/>
</form>

</body>
</html>

2、创建上传脚本,命名为"upload_file.php" 文件含有供上传文件的代码:

<?php
if($_FILES["file"]["error"]>0)
{
echo"Error:".$_FILES["file"]["error"]."<br/>";
}
else
{
echo"Upload:".$_FILES["file"]["name"]."<br/>";
echo"Type:".$_FILES["file"]["type"]."<br/>";
echo"Size:".($_FILES["file"]["size"]/1024)."Kb<br/>";
echo"Storedin:".$_FILES["file"]["tmp_name"];
}
?>

注:通过使用 PHP 的全局数组 “$_FILES”,就可以实现从客户计算机向远程服务器上传文件。

❸ PHP 文件上传安全需要注意哪些方面

1,文件大小
2,编码
3,CSV的话,定长不定长

❹ php 在做文件上传时,如何设置才能更安全

只允许上传图片,服务器端收到文件后,利用GD函数获取图片信息,对各属性超过范围的文件拒绝接受,我的程序例子如下:

$tmp_name=$HTTP_POST_FILES["f_image"][tmp_name];
$imginfo=getimagesize($tmp_name);
//压缩宽度超过800的图片为800,10K以上的JPG图片用30%进行压缩
if ($imginfo[0]>800){
echo "你上传的图片幅面为 $imginfo[0] x $imginfo[1] ,将被压缩到800个象素宽。<br>";
system('"C:\Program Files\ImageMagick-6.0.7-Q16\convert.exe"'." -sample 800 -quality 80 $tmp_name $tmp_name");
} elseif($imginfo[2]==2 && $src_size>10240) system('"C:\Program Files\ImageMagick-6.0.7-Q16\convert.exe"'." -quality 30 $tmp_name $tmp_name");

❺ 求PHP上传文件夹的三种解决方案

1 压缩上传(用户把文件夹压缩后上传),
2 input里加这个属性webkitdirectory就是默认可以上传文件夹了。谷歌浏览器可以。其他浏览器好像不行
3 业务上进行优化 如:(上传时还是上传文件,但是需要填写文件夹得名称,上传之后,后台根据文件夹名称,自动创建文件夹)

❻ 北大青鸟设计培训:用PHP控制FTP文件上传

利用PHP,你总是可以有多种方式来完成某个特定的任务。
我们就拿文件上传举个例子。
当然了,你可以按照传统的方式来使用HTTP文件上传,把文件直接传输到Web服务器磁盘上。
烟台电脑培训http://www.kmbdqn.cn/认为你还可以用更加奇异的方式上传,用FTP协议两步就完成上传:从你的本地硬盘到Web服务器,然后再到FTP服务器。
PHP在本机同时支持FTP和HTTP上传,所以你可以根据自己应用程序的设计需要进行最佳的选择。
使用PHP的FTP函数进行文件传输几乎与使用传统的FTP客户端相同——你会看到连函数的名字都和标准的FTP命令类似。
关于HTTP文件上传的文章已经多得满天飞了,这就是为什么本文有必要把注意力放在基于FTP的文件上传上了(但是在后面给出的例子中,两种方式你都会看到)。
要注意的是,本教程假设你已经安装好了PHP/Apache,而且HTTP文件上传和FTP的函数都已经激活了。
第一步:确信你拥有连接/上传到FTP服务器的权限PHP的FTP函数需要客户端-服务器连接,所以你需要在进行文件上传之前登录到目标服务器上。
你的第一项任务是确信你已经拥有了完成这项任务的信任书。
这一步可能看起来是理所当然的,但是你会惊奇地发现有多少开发人员忘了这么做,结果后来浪费大量的时间来解决因此而出现的问题。

❼ 如何设计出一个安全的文件上传功能

这两天我们的老朋友PDP在BlackHat 08上做了一个关于GIFAR的演讲。和往常一样,PDP的东西基本上都很猥琐,这个也是。主题是关于是如何把GIF或者 JPG文件和JAR文件捆绑在一起,然后欺骗服务器以为是GIF或JPG文件,结果却是在客户端的JVM中执行JAR的例子。
他还举了些欺骗的例子,比如在office2007中,doc文件实际上就是zip格式了,里面都是些xml,那么他把jar文件打包在zip文件里,再把后缀改成doc,来达到欺骗的目的。
在这里是客户端的问题,我想到的则是其他的问题,比如安全上传。
根据以往的经验看来,我们可能会设计如下文件上传的安全规则:
1. 文件上传的目录设置为不可执行
2. 判断文件类型
3. 单独设置文件服务器的域名
4. 改写文件名,文件路径不可预测
第一点规则是显而易见的,是为了减小执行动态语言脚本的风险。如果被成功上传了一个webshell,但是不能执行,还是能够起到深度防御的作用。
第二点,在判断文件类型的时候,我们一般要求使用白名单,而不是黑名单,因为黑名单可能会列不全,还可能会造成一些bypass的风险。
比如以前老版本的 FCKEditor就出过这种问题,只做了黑名单的控制,最后被bypass。
而apache有个特性,是解析第一个“ . ”后的文件后缀作为文件类型,比如 fvck.php.rar.rar.rar 会被apache当作 fvck.php解析。 我最近看了下php的手册,在安装文档里,针对这个问题,专门有一个指导:
15. Tell Apache to parse certain extensions as PHP. For example, lets have
Apache parse .php files as PHP. Instead of only using the Apache AddType
directive, we want to avoid potentially dangerous uploads and created
files such as exploit.php.jpg from being executed as PHP. Using this
example, you could have any extension(s) parse as PHP by simply adding
them. Well add .phtml to demonstrate.
<FilesMatch .php$>
SetHandler application/x-httpd-php
</FilesMatch>
IIS6也有这种类似的特性,即在文件夹名字为 fvck.asp 时(fvck可替换为任意值),该文件夹下任何文件都会被当作asp来执行,
至今似乎也未见到微软有把这个特性当作bug来fix的迹象。
所以如果不熟悉这些webserver的特性,你可能会觉得漏洞来的如此神奇:我明明做了充分限制,为什么还是被“做俯卧撑”了?
在判断文件类型的时候,大多数程序都是使用的采用检查文件后缀的方法,这里主要需要注意的hacking trick是某些检查函数是否会以0字节作为结束的判断,以前动网就出过类似的漏洞,上传 fvck.jpg%00.asp即可绕过文件类型检查。
我也见过只检查文件头部的,这种也很好欺骗,构造一个合法的gif文件头部,然后将webshell贴在后面,在后缀合法的情况下,一样能够被浏览器解析:
GIF89a ?
<? phpinfo(); ?>
比较高级一点的是做更多的文件格式检查,比如检查图片里像素的长宽等,然后再对图片做一次压缩,这样出来的图片基本都变形了,有啥webshell也被破坏了。
而检查文件格式时候一般会用到一些网上已经封装好的类,在扫描文件格式方面还是比较有优势的。但是在检查大文件的时候效率显然是一个需要考虑的问题,很多程序员出于效率原因可能不太会愿意选择这种方式。
但是今天从PDP的这个绑定文件的猥琐方法看来,详细检查文件格式的方法还是非常有必要的,因为攻击者的目标可能不光是服务器,还是客户端,如果要对客户端有所保证,就必须要详细检查文件格式,使之落在白名单中。
第三点,单独设置文件服务器域名,也是一种针对客户端的保护。这样可能会避免许多跨域的问题。如果发生了XSS,攻击者可能还需要突破跨域的限制才能进一步扩大战果。再比如如果被上传了crossdomain.xml,可能就会导致flash的跨域问题,这些都是实实在在的风险。
第四点,改写文件名,随机文件路径。这是把风险藏起来,现在基本上尽职一点的程序员都会这么设计,这也是最大程度减小风险的非常切实有效的手段。
需要注意的是构造随机文件名或路径的算法需要足够“随机”,而不要从比如cookie之类的地方直接取一段hash出来。比较好的做法是在server上用类似random()一类的函数来生成,相信程序员们这点意识还是有的,不再赘述了。

❽ php文件上传

如果 即使存在也不是重要文件的话,可以不管文件是否存在, 直接删了再move就行。
**********
**********
**********

$dir = '../../images/proct/';
$filepath = $dir . $id . '.' . $file_ext;

/* 添加部分 */
@unlink($filepath );

if (is_uploaded_file($tmp_filename)) { //判断是否通过HTTP POST上传
******************
******************
******************

❾ php上传文件

前端页面:

<formaction=""method="post"enctype="multipart/form-data">
<inputtype="file"name="file">
<inputtype="submit"name="submit"value="Submit">
......
</form>

后台接收页面:

if(is_uploaded_file($_FILES['file']['tmp_name'])){
if(move_uploaded_file($_FILES['file']['tmp_name'],'目标路径')){
//上传成功
}else{
//上传失败
}
}

❿ php文件上传怎么做

PHP上传用到的知识(不懂的可以到网上找资料):1、FORM标签enctype属性表单中enctype="multipart/form-data"的意思,是设置表单的MIME编码。默认情况,
这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;
只有使用了multipart/form-data,才能完整的传递文件数据 input标签 type 属性中的 "file"
2、$_FILES 系统函数 $_FILES['myFile']['name'] 客户端文件的原名称。
$_FILES['myFile']['type'] 文件的 MIME 类型,例如"image/gif"。
$_FILES['myFile']['size'] 已上传文件的大小,单位为字节。
$_FILES['myFile']['tmp_name'] 储存的临时文件名,一般是系统默认。
$_FILES['myFile']['error'] 该文件上传相关的错误代码。

热点内容
c语言小程序游戏 发布:2025-08-17 18:23:09 浏览:795
ios今日头条源码 发布:2025-08-17 18:23:02 浏览:305
大众途安l和gl6配置哪个好点 发布:2025-08-17 18:16:26 浏览:220
搭建网狐数据库没有服务器 发布:2025-08-17 18:16:16 浏览:136
影视源码盗版 发布:2025-08-17 18:15:45 浏览:692
服务器怎么强制停止 发布:2025-08-17 18:15:44 浏览:524
爱奇艺如何更改密码 发布:2025-08-17 18:03:00 浏览:818
如何把文字变成密码 发布:2025-08-17 18:02:54 浏览:352
安卓刷机首页字母按哪个 发布:2025-08-17 17:59:07 浏览:583
c语言实现哈夫曼编码 发布:2025-08-17 17:54:50 浏览:48