Php 我如何安全地处理没有';结尾没有文件扩展名吗?

Php 我如何安全地处理没有';结尾没有文件扩展名吗?,php,laravel,Php,Laravel,我正在构建一个系统,使用Laravel媒体库来存储URL中的图像,而不是上传的图像。在测试中,我使用$faker->imageUrl($width=640,$height=480)生成一个随机url。在控制器上,我有一个helper函数,该函数从图像url获取文件扩展名,以帮助创建要存储的文件名: 助手 function getFileExtensionFromImgPath($image_path) { $typeString = null; $typeInt = exif

我正在构建一个系统,使用Laravel媒体库来存储URL中的图像,而不是上传的图像。在测试中,我使用
$faker->imageUrl($width=640,$height=480)
生成一个随机url。在控制器上,我有一个helper函数,该函数从图像url获取文件扩展名,以帮助创建要存储的文件名:

助手

function getFileExtensionFromImgPath($image_path)
{


    $typeString = null;
    $typeInt = exif_imagetype($image_path);

    //dd($typeInt);

    switch($typeInt) {
        case IMG_GIF:
        $typeString = 'gif';
        break;
        case IMG_JPG:
        $typeString = 'jpg';
        break;
        case IMAGETYPE_JPEG:
        $typeString = 'jpeg';
        break;
        case IMAGETYPE_PNG:
        $typeString = 'png';
        break;
        case IMG_WBMP:
        $typeString = 'wbmp';
        break;
        case IMG_XPM:
        $typeString = 'xpm';
        break;
        default: 
        $typeString = 'unknown';
    }

    return $typeString;
}
控制器方法

public function store(Request $request)
{
    $imgPath = $request->input('img_path');
    if (!empty($imgPath)) {

        //Create filename

        $filename = time() . '_' . $post->slug . "." . getFileExtensionFromImgPath($imgPath);

        dd($filename);

        // Store in Laravel media manager
        $post->addMediaFromUrl($imgPath)->usingFileName($filename)->toMediaCollection('post_thumbnail');

    }
    //dd($post->getFirstMedia('post_thumbnail')->getPath());
    return new PostResource($post);
}
我一直遇到的问题是,
$faker->imageUrl($width=640,$height=480)
没有生成带有扩展名(如JPG或PNG:
http://lorempixel.com/800/400/cats/Faker/
在测试过程中会给我一个

ErrorException:exif_imagetype():读取错误

如何安全地处理结尾没有文件扩展名的图像url提交

编辑


我正在寻找帮助函数的帮助,以确定没有文件扩展名的链接是否是图像。当我将通过请求传递的图像设置为具有类似jpg、png的文件扩展名时,测试成功。我试图找出一个url链接没有文件扩展名的用例

首先,您需要弄清楚您的用户是要传递现有图像的URL,还是要实际上传文件,您的控制器代码让我相信后者

我认为您的控制器代码可能很好,这实际上是您的测试设置需要工作,目前您正在将URL传递给控制器,然后尝试将其视为实际文件,但在生产中,它实际上会收到一个实际文件,该文件将是light/Http/UploadedFile的实例

因此,在测试中,您应该使用
UploadedFile::fake()->image('avatar.jpg')
而不是
$faker->imageUrl($width=640,$height=480)

您可以更改文件扩展名以满足您的需要,或者类似于
UploadedFile::fake()->image($faker->randomElement(['avatar.jpg'、'avatar.png'、'avatar.gif'、'avatar.bmp',])之类的内容。

以下是关于测试文件上传的完整Laravel文档:


除非您知道
lorempixel.com
总是返回JPEG,否则唯一的方法是下载图像并分析格式(例如,使用POSIX
文件
命令,或ImageMagick
标识
命令,或通过PHP扩展等效).你能给我举一个使用
Imagick::identifyImage
的例子吗。我尝试了
$image=newimagick($real\u location);dd($图像)我刚刚收到一封500美元的信,谢谢你的回答。对不起,我应该更清楚的图像URL的将提交的链接,而不是上传。当我使用类似于
avatar.jpg
的东西时,测试成功了,但问题是图像的链接可能没有扩展就提交了。再次谢谢你,我很困惑。我读错了吗?或者您希望支持两种情况,即可以上载真实图像或现有图像的URL?或者你只想处理图像URL?对不起,我一定说错了。我只是支持从web上获取现有图像的URL。