ホームページ > バックエンド開発 > PHPチュートリアル > ユーザーがアップロードした写真が通常の写真であるかどうかを判断します

ユーザーがアップロードした写真が通常の写真であるかどうかを判断します

巴扎黑
リリース: 2016-11-11 13:35:01
オリジナル
1413 人が閲覧しました

ファイルのアップロードは、ユーザーがアップロードした画像が通常の画像 (JPGGIFPNG) であるかどうかを判断する最も安全な方法を使用するようにしてください。

問題解決のアイデア:
1. 送信されたファイルの拡張子が画像であるかどうかを確認します (このステップは簡単に偽造できるため、信頼性がありません)
2. ファイルが本当に画像であるかどうかを確認します。ファイルのヘッダー情報 (最初のステップは基本的に画像ですが、トロイの木馬スクリプトが含まれている可能性があります)
3. 正規表現を使用して、ファイルにトロイの木馬スクリプトが含まれているかどうかを確認します

以下は PHP のバージョン コードです「Stick to the End」の

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

<?php

//允许的图片类型

$imageType = array(&#39;jpg&#39;,&#39;gif&#39;,&#39;png&#39;);

//上传后存放的路径

$uploadfile = &#39;./data/&#39; . basename($_FILES[&#39;userfile&#39;][&#39;name&#39;]);

//获取文件的扩展名

$finfo = new SplFileInfo($_FILES[&#39;userfile&#39;][&#39;name&#39;]);

$extName=$finfo->getExtension();

//第一道关卡,简单过滤非法文件。

if(!in_array($extName,$imageType)){

    exit(&#39;只能上传gif、png和jpg的图片&#39;);

}

//依据文件头信息检查图片的真实类型

//1 IMAGETYPE_GIF

//2 IMAGETYPE_JPEG

//3 IMAGETYPE_PNG

$realType=exif_imagetype($_FILES[&#39;userfile&#39;][&#39;tmp_name&#39;]);

if( 1 == $realType || 2 ==$realType || 3 ==$realType){

    //开始检查是否存在木马代码

    $safe=is_safe($_FILES[&#39;userfile&#39;][&#39;tmp_name&#39;]);

    if(!$safe){

        exit (&#39;图片包含木马,禁止上传!&#39;);

    }

    if (move_uploaded_file($_FILES[&#39;userfile&#39;][&#39;tmp_name&#39;], $uploadfile)) {

        echo "文件上传成功.\n";

    } else {

        echo "上传失败!\n";

    }

}else{

    exit (&#39;只能上传gif、png和jpg的图片&#39;);

}

function is_safe($fileurl) {

    $handle = fopen($fileurl, &#39;rb&#39;);

    $fileSize = filesize($fileurl);

    fseek($handle, 0);

    if ($fileSize > 512) { // 取头和尾

        $hexCode = bin2hex(fread($handle, 512));

        fseek($handle, $fileSize - 512);

        $hexCode .= bin2hex(fread($handle, 512));

    } else { // 取全部

        $hexCode = bin2hex(fread($handle, $fileSize));

    }

    fclose($handle);

    /* 匹配16进制中的 <% ( ) %> */

    /* 匹配16进制中的 <? ( ) ?> */

    /* 匹配16进制中的 <script | /script> 大小写亦可*/

    //匹配表示有木马

    return !preg_match("/(3c25.*?28.*?29.*?253e)|(3c3f.*?28.*?29.*?3f3e)|(3C534352495054)|(2F5343524950543E)|(3C736372697074)|(2F7363726970743E)/is", $hexCode);

}

ログイン後にコピー


関連ラベル:
php
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート