Slide 1

Slide 1 text

PHPͷ༷ʑͳΤϥʔ hachiojipm #75 2019/03/16 @uzulla

Slide 2

Slide 2 text

લఏ » ඞͣ͠·͠ΐ͏ɻ error_reporting(E_ALL);

Slide 3

Slide 3 text

PHPͷΤϥʔ » ࣗ༝ͳՕॴͰͷΩϟον͸͔ͳΓࠔ೉͕ͩɺϋϯυϥΛઃఆͰ͖Δ » PHP 7ʹͳΓɺେମ͕ʮErrorʯͱ͍͏Exceptionʹͳͬͨ » Ωϟον͠ͳ͍ͱ(ຊ෺ͷ)Errorʹม׵͞ΕΔ » ʢঘɺྫ֎Ωϟον͠ͳ͚Ε͹͍ͣΕʹͤΑࢮ͵ʣ » શ෦͕ྫ֎Ͱ͸ͳ͍͕ɺେମThrowableΛΩϟον͢Ε͹Α͍ » ͔͠͠Թނ஌৽ɺൿ఻ͷλϨΛ͔͖ճͧ͢ɻ

Slide 4

Slide 4 text

Τϥʔͷେ·͔ͳ෼ྨʢཁग़యʣ » ໰౴ແ༻Ͱࢮ͵΍ͭ » Fatal Errors » Parse Error » ࢮ͵͚Ͳख౰͢Ε͹ࢮͳͳ͍΍ͭ » Recoverable Fatal Error » ख౰͠ͳͯ͘΋ࢮͳͳ͍΍ͭ » Warning » Noticeʢ౳

Slide 5

Slide 5 text

recoverable ͱ͸… » Τϥʔʢྫ֎Έ͍ͨͳͷʣΛΩϟονͯ͠ѲΓͭͿͤ͹ࢮͳͳ͍ » ޙड़

Slide 6

Slide 6 text

෼ྨΛ͞Βʹࡉ໨ʹ

Slide 7

Slide 7 text

Fatal, Parse(Syntax) Error » E_ERROR » E_CORE_ERROR » E_COMPILE_ERROR » E_USER_ERROR » E_PARSE

Slide 8

Slide 8 text

Recoverable Fatal Error » E_RECOVERABLE_ERROR

Slide 9

Slide 9 text

Warning » E_WARNING » E_CORE_WARNING » E_COMPILE_WARNING » E_USER_WARNING

Slide 10

Slide 10 text

Notice ͳͲ » E_DEPRECATED » E_USER_DEPRECATED » E_NOTICE » E_USER_NOTICE » (E_STRICT)

Slide 11

Slide 11 text

E_ERROR (1<<0L) 1 E_WARNING (1<<1L) 2 E_PARSE (1<<2L) 4 E_NOTICE (1<<3L) 8 E_CORE_ERROR (1<<4L) 16 E_CORE_WARNING (1<<5L) 32 E_COMPILE_ERROR (1<<6L) 64 E_COMPILE_WARNING (1<<7L) 128 E_USER_ERROR (1<<8L) 256 E_USER_WARNING (1<<9L) 512 E_USER_NOTICE (1<<10L) 1024 E_STRICT (1<<11L) 2048 E_RECOVERABLE_ERROR (1<<12L) 4096 E_DEPRECATED (1<<13L) 8192 E_USER_DEPRECATED (1<<14L) 16384

Slide 12

Slide 12 text

Ͱ͸Ҿ͖ى͜͠·͠ΐ͏

Slide 13

Slide 13 text

E_ERROR » DateTimeInterfaceΛΠϯϓϦ͠Α͏ͱ͢ΔͳͲ class b implements DateTimeInterface { } new b();

Slide 14

Slide 14 text

ଈࢮ͢ΔͷͰ » ʢޙड़ͷʣset_error_hander΋ݺ͹Εͳ͍ » ͳʹ΋Ͱ͖ͳ͍ɺඞͣࢮ͵ » ͔͠͠ɺΤϥʔͷ؃औΓ͘Β͍͸Ͱ͖Δ

Slide 15

Slide 15 text

஌Δʹ͸ register_shutdown_function(function () { $error = error_get_last(); if ( !is_array($error) || !( $error['type'] & (E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_PARSE | E_USER_ERROR) ) ) { return; // set_error_handelerͰर͍͑ͯΔ͸ͣͳͷͰແࢹ } // र͑ͳ͔ͬͨFATALͳΤϥʔ echo "{$error['type']}:{$error['message']}". " in {$error['file']}:{$error['line']}"; });

Slide 16

Slide 16 text

۩ମྫ

Slide 17

Slide 17 text

» Կ౓΋ݴ͏͚Ͳɺٹ͑ΔΘ͚Ͱ͸ͳ͍ » ۤ೑ͷϩάͨ͠ΓɺΤϥʔը໘Λग़ͨ͠Γఔ౓ » ૹ৴ͨ͠σʔλ͕΋ͲΔΘ͚Ͱ͸ͳ͍ͷͰɺΰϛͷͳ͍ΩϨΠͳΤ ϥʔը໘Λग़ͨ͢Ίʹ͸ग़ྗͳͲΛOutput bufferingͯ͠ૹ৴͠ͳ ͍Ͱ͓͘͜ͱ » https://uzulla.hateblo.jp/entry/2019/03/13/200820 » ͋·Γڽͬͨࣄ͸͠ͳ͍΄͏͕ແ೉ʢ͢Ͱʹ͓͔͍͠ঢ়ଶ͔ͩΒ Ͷʂʣ

Slide 18

Slide 18 text

E_CORE_ERROR » vmपΓͷΤϥʔ…ൃੜͤ͞Δํ๏͕Θ͔ΒΜ » odbcʹ͋Γͦ͏ʢ͔͠͠odbcΛ࢖͏ࣄͳͲ͋Δͷ͔…ʁ » (ྑ͍αϯϓϧίʔυͭ͘Εͳ͔ͬͨ!)

Slide 19

Slide 19 text

E_COMPILE_ERROR » ఆٛࡁΈͷΫϥεΛએݴ͢Ε͹Α͍ class DateTime{}

Slide 20

Slide 20 text

E_USER_ERROR » ࣗ෼Ͱ౤͛ΒΕΔ » trigger_error trigger_error("test error", E_USER_ERROR);

Slide 21

Slide 21 text

E_PARSE » จ๏ؒҧ͑ΔͳͲ » ࢮ͵͠ɺ࠷ॳͷϑΝΠϧͩͱregister_shutdown_function΋ݺ͹Εͳ͍

Slide 22

Slide 22 text

஫ҙɺEvalʹ͍ͭͯ » eval΋E_PARSE͕ൃੜ͢Δͷ͕ͩɺྫ֎ͷΩϟονΛ͠ͳ͍৔߹ͷΈੜ·ΕΔ » ͳ͓ɺྫ֎ΛΩϟον͠ͳ͍ͱFatal Errorѻ͍ʹͳΓɺࢮ͵ɻ » PHPϜζΧγΠωʔ // ࢮͳͳ͍ʢ͠ɺѲΓ௵ͤ͹Τϥʔ΋ͳ͍ʣ try{ eval("if if(1){};"); }catch(\Throwable $e){ } // Uncaught ExceptionͰ਌͝ͱࢮ͵ eval("if if(1){};");

Slide 23

Slide 23 text

E_RECOVERABLE_ERROR » ΦϒδΣΫτΛແ஡ͳΩϟετ͢ΔͳͲͯ͠ൃੜͰ͖Δ » ࢮ͵…͕ɺ෮׆Ͱ͖Δ echo function() {};

Slide 24

Slide 24 text

ͨͱ͑͹͜ΕΛೖΕΔͱɺऴྃ͠ͳ͍ » NoticeؚΊɺ͋ΒΏΔΤϥʔʢFatalআ͘ʣ͕ඈͼࠐΉ » Notice΋͘ΔͷͰɺ͜͜ͰExit͢ΔͱNotice΋ڐ͞ͳ͍ࣄ͕Ͱ͖Δ ʢ෭࡞༻తϝϦοτʢओ؍ʣʣ set_error_handler(function ($type, $message, $file, $line) { error_log("Error: {$type}:{$message} in {$file}:{$line}"); // ͜͜Ͱ exit͠ͳ͍ͱɺ໭࣮ͬͯߦ͕ଓ͘ // ྫ֎ͷѲΓͭͿ͠ͷΑ͏ͳ΋ͷ });

Slide 25

Slide 25 text

E_WARNING » ͢ͰʹϘσΟ͕ૹ৴։࢝͞Ε͍ͯΔͷʹɺϔομʔΛ͓͘Ζ͏ͱͨ͠ ࣌ͳͲ » ࢮͳͳ͍ɺͷ͕ࠔΔɻʢͷͰɺલड़ͷςΫΛ࢖͏ͱΑ͍ࣄ΋ʣ header("X-MY-HEADER: hoge"); echo "hoge"; session_start();

Slide 26

Slide 26 text

E_CORE_WARNING » ଘࡏ͠ͳ͍֦ுΛphp.iniͰࢦఆ͢Δ ౳ » ΍͸Γαϯϓϧίʔυ͕͍͍ײ͡ͷ͕ͳ͔ͬͨͷͰলུ

Slide 27

Slide 27 text

E_COMPILE_WARNING » /*Λด͡ͳ͍ͳͲ » ιʔείʔυͷจࣈίʔυΛ͓͔͘͢͠ΔͳͲ » ͜ΕɺWarnͱ͍͏͔Syntax ErrorͰ͸ͳ͍ͷ͔ͱ…

Slide 28

Slide 28 text

E_USER_WARNING » ࣗ෼Ͱtrigger͢Δ trigger_error("test error", E_USER_WARNING);

Slide 29

Slide 29 text

E_DEPRECATED » ඇਪ঑ͷؔ਺ʢ΍ڍಈʣΛͤ͞Δ » error_reporting(E_ALL)ͯ͠ͳ͍ͱͰͳ͍ error_reporting(E_ALL); define("SomeThing", "is", true);

Slide 30

Slide 30 text

E_USER_DEPRECATED » ࣗ෼Ͱ౤͛Δ » error_reporting(E_ALL)ͯ͠ͳ͍ͱͰͳ͍ trigger_error("test error", E_USER_DEPRECATED);

Slide 31

Slide 31 text

E_NOTICE » ະఆٛม਺ʹ৮Δɺଘࡏ͠ͳ͍ൣғͷ഑ྻʹ৮Δ » error_reporting(E_ALL)ͯ͠ͳ͍ͱͰͳ͍ echo $undefined;

Slide 32

Slide 32 text

E_USER_NOTICE » ࣗ෼Ͱ౤͛Δ » error_reporting(E_ALL)ͯ͠ͳ͍ͱͰͳ͍ trigger_error("test error", E_USER_DEPRECATED);

Slide 33

Slide 33 text

(E_STRICT) » PHP5·Ͱ͔͠ͳ͍ɺ7Ͱ͸ͳ͘ͳͬͨ(ଞʹҠಈ͞Εͨ) » ܧঝͨ͠ΫϥεϝιουͷϑΟϯΨʔϓϦϯτ͕ҧ͏ͱ͔ʢҾ਺͕ม ΘΔͱ͔ʣ

Slide 34

Slide 34 text

·ͱΊ » Ή͔͍ͣ͠ » ൿ఻ͷλϨ͕෗Δʢόʔδϣϯ্͕͕Δͱඍົʹʣ » ωοτʹ͸ʢࣗ෼ΛؚΊͯʣӕ͕ଟ͍ͷͰɺݕূͨ͠Γɺͨ·ʹλϨ Λ͔͖·ͥͳ͍ͱ͍͚ͳ͍ʢࠓ೔͔͖ࠞͥͨΒؒҧͬͯͨ…ʣ » ϏοτͷฒͼΛͳ͕Ί͍ͯΔͱɺ૿ઃͷྺ࢙Λײ͡ΒΕΔ » ·͋PHPͳͷͰͶʂ

Slide 35

Slide 35 text

༨ஊ@ʹ͍ͭͯ » @Λ͚ͭͨࣜͷΤϥʔΛʮग़ྗ͠ͳ͍ʯʢ͚ͩʣ // $aม਺͕ແ͍࣌ php > echo @$a; // ΤϥʔͰͳ͍ɺNULLʹͳΔ php > echo $a; PHP Notice: Undefined variable: a in php shell code on line 1

Slide 36

Slide 36 text

» @ͳΒFatalͰࢮͳͳ͍Θ͚Ͱ΋ͳ͘ʢࠂ஌ͳ͘ࢮ͵͕ʣ » @͸ݟ͚ͭͨΒʢཧ༝͕ͳ͚Ε͹ʣফ͠·͠ΐ͏ // ݹ୅ɺ͜͏͍͏ॻ͖ํ΋͋ͬͨͳ $id = @$_POST['id']; // ͍·ͳΒ͜͏͔ $id = $_POST['id'] ?? null; » ͳ͓ɺࣗલͰset_error_handlerͨ͠Βແࢹ͞Εͳ͍ͷͰɺ@׆༻͢ Δݹ͍ϥΠϒϥϦΛ࢖͏࣌͸஫ҙʂ