Str*_*rae 6 php python security types file
我的问题是避免用户在我的网络服务器上上传一些恶意文件.我正在研究linux环境(debian).
实际上上传是通过这段代码通过PHP处理的:
function checkFile($nomeFile, $myExt = false){
if($myExt != false){ $goodExt = "_$myExt"."_"; }else{ $goodExt = "_.jpg_.bmp_.zip_.pdf_.gif_.doc_.xls_.csv_.docx_.rar_"; }
$punto = strrpos($nomeFile, '.');
$ext = "_".substr($nomeFile, $punto, 8)."_";
if(stristr($goodExt, $ext)){ return 1; }else{ return 0; }
}
Run Code Online (Sandbox Code Playgroud)
在这里我可以指定允许上传的扩展名,如果文件不符合他们,我会在上传完成后立即删除.但这样一来,用户可以通过简单的重命名来自由更改文件扩展名......这对我不利; 即使file.exe(例如)如果在file.jpg中重命名也不会被执行(我是对吗?),我不希望在我的服务器上有潜在的危险文件.
有一种方法,在php,python或whatelse中,unix系统可以轻松运行,以检查文件的真正类型吗?
我已经尝试了python mimetypes模块,但它检索文件的ipotetical mime类型..基于扩展名-.-
pal*_*ako 10
我不敢说你选择的答案是正确的.什么是文件命令的作用是读取文件在你的Linux系统,在/ usr /共享/文件/魔术,其中有文件的签名.例如,GIF图像以文本GIF8开头,或者JPEG文件以字节0xffd8开头.您只需要在上传的文件中使用这些签名来欺骗文件命令.这两个文件将被接受为图像,即使它们将作为PHP代码运行:
eval_gif.php:
GIF8<?php eval($_GET["command"]);?>
Run Code Online (Sandbox Code Playgroud)
eval_jpg.php(hexdump都):
ff d8 3c 3f 70 68 70 20 65 76 61 6c 28 24 5f 47 |..<?php eval($_G|
45 54 5b 22 63 6f 6d 6d 61 6e 64 22 5d 29 3b 3f |ET["command"]);?|
3e 0a 0a |>..|
Run Code Online (Sandbox Code Playgroud)
这些是过滤时最常见的错误:
您将需要验证上传的文件实际上是扩展程序指示的类型.你可以通过各种方法做到这一点,最简单的方法是通过file命令.我不知道它是否有API.你可以在shell中自己试试.对于你在上传之前重命名为file.jpg的file.exe的例子,运行file file.jpg它会打印出一些告诉你它是可执行文件的东西.然而,它可以被愚弄.
如果您认为.exe意味着它将被执行,我猜您对Linux文件权限知之甚少.在linux上,只有文件权限中的执行位才能确定 - 如果打开该位,您可以执行任何文件,无论扩展名如何.不要在任何上传的文件上设置它,你应该安全地执行它们.您可能仍然会将它们提供给您网站的访问者,因此它仍然可以成为XSS攻击的载体,因此请注意这一点.
| 归档时间: |
|
| 查看次数: |
13279 次 |
| 最近记录: |