PHPの様々なエラー

271fad8d53cd1f12f2b4b6d38e3d7bd3?s=47 uzulla
March 16, 2019

 PHPの様々なエラー

2019/03/17 at hachioji.pm #75 LT

271fad8d53cd1f12f2b4b6d38e3d7bd3?s=128

uzulla

March 16, 2019
Tweet

Transcript

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

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

  3. PHPͷΤϥʔ » ࣗ༝ͳՕॴͰͷΩϟον͸͔ͳΓࠔ೉͕ͩɺϋϯυϥΛઃఆͰ͖Δ » PHP 7ʹͳΓɺେମ͕ʮErrorʯͱ͍͏Exceptionʹͳͬͨ » Ωϟον͠ͳ͍ͱ(ຊ෺ͷ)Errorʹม׵͞ΕΔ » ʢঘɺྫ֎Ωϟον͠ͳ͚Ε͹͍ͣΕʹͤΑࢮ͵ʣ

    » શ෦͕ྫ֎Ͱ͸ͳ͍͕ɺେମThrowableΛΩϟον͢Ε͹Α͍ » ͔͠͠Թނ஌৽ɺൿ఻ͷλϨΛ͔͖ճͧ͢ɻ
  4. Τϥʔͷେ·͔ͳ෼ྨʢཁग़యʣ » ໰౴ແ༻Ͱࢮ͵΍ͭ » Fatal Errors » Parse Error »

    ࢮ͵͚Ͳख౰͢Ε͹ࢮͳͳ͍΍ͭ » Recoverable Fatal Error » ख౰͠ͳͯ͘΋ࢮͳͳ͍΍ͭ » Warning » Noticeʢ౳
  5. recoverable ͱ͸… » Τϥʔʢྫ֎Έ͍ͨͳͷʣΛΩϟονͯ͠ѲΓͭͿͤ͹ࢮͳͳ͍ » ޙड़

  6. ෼ྨΛ͞Βʹࡉ໨ʹ

  7. Fatal, Parse(Syntax) Error » E_ERROR » E_CORE_ERROR » E_COMPILE_ERROR »

    E_USER_ERROR » E_PARSE
  8. Recoverable Fatal Error » E_RECOVERABLE_ERROR

  9. Warning » E_WARNING » E_CORE_WARNING » E_COMPILE_WARNING » E_USER_WARNING

  10. Notice ͳͲ » E_DEPRECATED » E_USER_DEPRECATED » E_NOTICE » E_USER_NOTICE

    » (E_STRICT)
  11. 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
  12. Ͱ͸Ҿ͖ى͜͠·͠ΐ͏

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

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

  15. ஌Δʹ͸ 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']}"; });
  16. ۩ମྫ <?php 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; } error_log("Fatal Error:{$error['type']}:{$error['message']}". " in {$error['file']}:{$error['line']}"); }); class b implements DateTimeInterface {} new b();
  17. » Կ౓΋ݴ͏͚Ͳɺٹ͑ΔΘ͚Ͱ͸ͳ͍ » ۤ೑ͷϩάͨ͠ΓɺΤϥʔը໘Λग़ͨ͠Γఔ౓ » ૹ৴ͨ͠σʔλ͕΋ͲΔΘ͚Ͱ͸ͳ͍ͷͰɺΰϛͷͳ͍ΩϨΠͳΤ ϥʔը໘Λग़ͨ͢Ίʹ͸ग़ྗͳͲΛOutput bufferingͯ͠ૹ৴͠ͳ ͍Ͱ͓͘͜ͱ »

    https://uzulla.hateblo.jp/entry/2019/03/13/200820 » ͋·Γڽͬͨࣄ͸͠ͳ͍΄͏͕ແ೉ʢ͢Ͱʹ͓͔͍͠ঢ়ଶ͔ͩΒ Ͷʂʣ
  18. E_CORE_ERROR » vmपΓͷΤϥʔ…ൃੜͤ͞Δํ๏͕Θ͔ΒΜ » odbcʹ͋Γͦ͏ʢ͔͠͠odbcΛ࢖͏ࣄͳͲ͋Δͷ͔…ʁ » (ྑ͍αϯϓϧίʔυͭ͘Εͳ͔ͬͨ!)

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

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

  21. E_PARSE » จ๏ؒҧ͑ΔͳͲ » ࢮ͵͠ɺ࠷ॳͷϑΝΠϧͩͱregister_shutdown_function΋ݺ͹Εͳ͍ <?php require("bad.php"); // register_shutdown_functionݺ͹ΕΔ ...

    <?php if if (1){} // ͳʹ΋Ͱ͖ͣଈࢮ
  22. ஫ҙɺEvalʹ͍ͭͯ » eval΋E_PARSE͕ൃੜ͢Δͷ͕ͩɺྫ֎ͷΩϟονΛ͠ͳ͍৔߹ͷΈੜ·ΕΔ » ͳ͓ɺྫ֎ΛΩϟον͠ͳ͍ͱFatal Errorѻ͍ʹͳΓɺࢮ͵ɻ » PHPϜζΧγΠωʔ // ࢮͳͳ͍ʢ͠ɺѲΓ௵ͤ͹Τϥʔ΋ͳ͍ʣ

    try{ eval("if if(1){};"); }catch(\Throwable $e){ } // Uncaught ExceptionͰ਌͝ͱࢮ͵ eval("if if(1){};");
  23. E_RECOVERABLE_ERROR » ΦϒδΣΫτΛແ஡ͳΩϟετ͢ΔͳͲͯ͠ൃੜͰ͖Δ » ࢮ͵…͕ɺ෮׆Ͱ͖Δ echo function() {};

  24. ͨͱ͑͹͜ΕΛೖΕΔͱɺऴྃ͠ͳ͍ » NoticeؚΊɺ͋ΒΏΔΤϥʔʢFatalআ͘ʣ͕ඈͼࠐΉ » Notice΋͘ΔͷͰɺ͜͜ͰExit͢ΔͱNotice΋ڐ͞ͳ͍ࣄ͕Ͱ͖Δ ʢ෭࡞༻తϝϦοτʢओ؍ʣʣ set_error_handler(function ($type, $message, $file,

    $line) { error_log("Error: {$type}:{$message} in {$file}:{$line}"); // ͜͜Ͱ exit͠ͳ͍ͱɺ໭࣮ͬͯߦ͕ଓ͘ // ྫ֎ͷѲΓͭͿ͠ͷΑ͏ͳ΋ͷ });
  25. E_WARNING » ͢ͰʹϘσΟ͕ૹ৴։࢝͞Ε͍ͯΔͷʹɺϔομʔΛ͓͘Ζ͏ͱͨ͠ ࣌ͳͲ » ࢮͳͳ͍ɺͷ͕ࠔΔɻʢͷͰɺલड़ͷςΫΛ࢖͏ͱΑ͍ࣄ΋ʣ header("X-MY-HEADER: hoge"); echo "hoge";

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

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

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

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

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

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

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

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

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

    » ·͋PHPͳͷͰͶʂ
  35. ༨ஊ@ʹ͍ͭͯ » @Λ͚ͭͨࣜͷΤϥʔΛʮग़ྗ͠ͳ͍ʯʢ͚ͩʣ // $aม਺͕ແ͍࣌ php > echo @$a; //

    ΤϥʔͰͳ͍ɺNULLʹͳΔ php > echo $a; PHP Notice: Undefined variable: a in php shell code on line 1
  36. » @ͳΒFatalͰࢮͳͳ͍Θ͚Ͱ΋ͳ͘ʢࠂ஌ͳ͘ࢮ͵͕ʣ » @͸ݟ͚ͭͨΒʢཧ༝͕ͳ͚Ε͹ʣফ͠·͠ΐ͏ // ݹ୅ɺ͜͏͍͏ॻ͖ํ΋͋ͬͨͳ $id = @$_POST['id']; //

    ͍·ͳΒ͜͏͔ $id = $_POST['id'] ?? null; » ͳ͓ɺࣗલͰset_error_handlerͨ͠Βແࢹ͞Εͳ͍ͷͰɺ@׆༻͢ Δݹ͍ϥΠϒϥϦΛ࢖͏࣌͸஫ҙʂ