我不想依赖文件扩展名.我不知道它是什么类型的图像(.jpg,.png等),我只是想知道文件是否是图像.如果可能的话,我宁愿不使用任何非.NET dll.
我知道如何做到这一点的最好方法如下:
bool isImageFile;
try
{
Image.FromFile(imageFile).Dispose();
isImageFile = true;
}
catch (OutOfMemoryException)
{
isImageFile = false;
}
Run Code Online (Sandbox Code Playgroud)
如上所述:http://msdn.microsoft.com/en-us/library/stf701f5.aspx,如果文件不是有效的图像格式,则Image.FromFile()抛出一个OutOfMemoryException.使用上面给出了我想要的结果,但是由于以下原因我不想使用它:
Image.FromFile()将整个图像文件(如果是图像文件)加载到内存中.这是浪费我假设因为我只需要文件类型,并且在我的代码中此时不需要进行任何进一步的图像处理.OutOfMemoryExceptions,因为如果有一个真正的内存不足问题,我的程序吞下它并继续前进?有没有更好的方法来做到这一点?或者,我上面列出的任何/所有问题都是无根据的?
编辑:自从收到答案后,这些是我现在知道的三个解决方案:
Image.FromFile()try-catch 将整个图像加载到内存中.
(我没有看到明确的"赢家",因为我可以想象每个人都适合的情况.对于我的应用程序的目的,文件类型检查不经常发生,方法1的性能问题不是问题.)
我在互联网上找到了以下代码,用于在php中上传安全图像.
我想知道它涵盖了图像上传中所有可能的攻击方式.
define('MAX_SIZE_EXCEDED', 101);
define('UPLOAD_FAILED', 102);
define('NO_UPLOAD', 103);
define('NOT_IMAGE', 104);
define('INVALID_IMAGE', 105);
define('NONEXISTANT_PATH', 106);
class ImgUploader
{
var $tmp_name;
var $name;
var $size;
var $type;
var $error;
var $width_orig;
var $height_orig;
var $num_type;
var $errorCode = 0;
var $allow_types = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG);
function __construct($fileArray)
{
foreach($fileArray as $key => $value)
{
$this->$key = $value;
}
if($this->error > 0)
{
switch ($this->error)
{
case 1: $this->errorCode = MAX_SIZE_EXCEDED; break;
case 2: $this->errorCode = MAX_SIZE_EXCEDED; break;
case 3: $this->errorCode = UPLOAD_FAILED; …Run Code Online (Sandbox Code Playgroud) 通过img标记包含外部图像以及如何避免它们,我的网站上会出现哪些安全漏洞?
我目前只检查mime-type提交时的扩展名和图像(可以在提交后更改URL)并URL在将其放入src属性之前进行清理.