1ãæååŸããã®ãµãŒãã¹ã¯ã«ã¯ã»ã³ãã«ã¯EDH Tier IVããŒã¿ã»ã³ã¿ãŒã§æ£åžžã«æ©èœããŸããããæåã®äŒè°ã§ãããããžã§ã¯ãå šäœã®åŒ±ããªã³ã¯ã§ãããšèªèããŸããããã¬ãŒã³ã¹ã®ãã€ã³ããšã¯ç°ãªãããã©ãããã©ãŒã ã¯èªæ ¢ã§ããŸããã§ãããã»ãã¥ãªãã£ã®åé¡ãšä»ã®12ã®æ¬ ç¹ããããŸãããæ±ºå®ã¯æçœã§ãã-ãµãŒãã¹ã¯æåããè¡ãããªããã°ãªããŸããã§ãããã«ã¯ã»ã³ãã«ã¯æ¿åºã説åŸããããã«æ®ã£ãã
ãã®å»è ã¯å£ããŠããŸããæ°ããå»è ãæã£ãŠããŠãã ããïŒãªãç§ãã¡ã¯æ°ãããã©ãããã©ãŒã ãäœãããšã«æ±ºããŸãã
å€ããã©ãããã©ãŒã ã«åŒŸäžžã眮ãããšãææ¡ããããã«ãç§ãã¡ã¯ãããäžç¥ããå¿ èŠããããŸãããèãããããã¹ãŠã®ã»ãã¥ãªãã£åé¡ãä¿®æ£ããŠèšèšãæŽæ°ãã代ããã«ããµãŒãã¹ãæåããæ§ç¯ããæ¹ãç°¡åã§ããããã®çç±ã¯3ã€ãããŸãã
1.ã·ã¹ãã ã¯ãã¬ãŒã ã¯ãŒã¯ãªãã§éçºãããŸãã
ãã®ããããã©ãããã©ãŒã ã«ã¯èããããªãã»ã©ã®æ°ã®åé¡ããããŸããã SymfonyãLaravelãYiiãªã©ã®äžè¬çãªãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠãµãŒãã¹ãäœæããå ŽåãORMã¯ããŒã¿ããŒã¹ãžã®ã¯ãšãªãæºåã§ãããã³ãã¬ãŒããšã³ãžã³ã¯åä¿¡ããã³ã³ãã³ãããšã³ãã³ãŒãã§ãããããå¹³å¡ãªéçºè ã§ãã»ãšãã©ã®ã»ãã¥ãªãã£åé¡ãåé¿ã§ããŸãããŠãŒã¶ãŒãšãã©ãŒã ã¯ããã©ã«ãã§CSRFããŒã¯ã³ã§ä¿è·ãããŠãããæ¿èªãšèªèšŒã¯éåžžãã»ãšãã©ç®±ããåºããŠå©çšã§ããŸããåãã±ãŒã¹ã§ããã©ãããã©ãŒã ã¯ç§ãã¡ã®éçºè ãåŠçæä»£ã«æããããããŸãã-ã³ãŒãã¯å€§åŠã§ã®åœŒã®æåã®ç 究宀ã§ã®ä»äºãšã»ãšãã©åãã«èŠããŸããã
ããšãã°ãããŒã¿ããŒã¹æ¥ç¶ãã©ã®ããã«å®è£ ãããããæ¬¡ã«ç€ºããŸããæ¥ç¶è³æ Œæ å ±ã¯ãäžèšã®åããã¡ã€ã«ã«ããŒãã³ãŒããããŠããŸãã
if (!isset($db)) { $db = new mysqli($db_info['host'], $db_info['user'], $db_info['pass'], $db_info['db']); if ($db->connect_errno) { die("Failed to connect to MySQL: " . $db->connect_errno); } if (!$db->set_charset("utf8")) { die("Error loading character set utf8 for MySQL: " . $db->connect_errno); } $db->autocommit(false); }
2.ãã©ãããã©ãŒã ã«ã¯å€ãã®ã»ãã¥ãªãã£åé¡ããããŸãã
ç£æ»ã®çµæããã®ãããªæ¬ é¥ããããšãæ©å¯ããŒã¿ãåãããã©ãããã©ãŒã ã¯ãã¡ãããåçŽãªããã°ã§ãæ¬çªç°å¢ã«ç§»è¡ã§ããªãããšãããããŸãããããã«ãããã®ããã€ãããããŸãã
- SQLã€ã³ãžã§ã¯ã·ã§ã³ããªã¯ãšã¹ãã®90ïŒ
ã«ã¯ãäºåã®æºåãªãã«ãŠãŒã¶ãŒãå
¥åããããŒã¿ãå«ãŸããŠããŸããã
$sql = " UPDATE user SET firstname='%s', lastname='%s', born='%s', prefix='%s', phone='%s', country_res='%s', extra=%s WHERE id=%d ;"; $result = $db->query(sprintf($sql, $_POST['firstname'], $_POST['lastname'], $_POST['born'], $_POST['prefix'], $_POST['phone'], $_POST['country'], isset($_POST['extra']) ? "'".$_POST['extra']."'" : "NULL", $_SESSION['user']['id'] ));
- XSSã®è匱æ§ãã«ã¹ã¿ã ã³ãŒãã¯ãåºåã®åã«ãã£ã«ã¿ãªã³ã°ãããŸããã§ããã
<button id="btn-doc-password" class="btn btn-primary btn-large pull-right" data-action="<?= $_GET['action'] ?>"><i class="fas fa-check"></i> <?= _e("Valider") ?></button>
ããã«ãå»åž«ã«çžè«ããçç±ãªã©ãããŒã¿ããŒã¹ã«å ¥åãããæ å ±ã¯ãããŒã¿ããŒã¹ã«æžã蟌ãåããŸãã¯ããŒãžã«è¡šç€ºããåã«ãã£ã«ã¿ãªã³ã°ãããŸããã§ããã - . ID , . . , ID .
- . , -. , qury-string .
$file_dir = $settings['documents']['dir'] . $_SESSION['client']['id'] . DIRECTORY_SEPARATOR . $_GET['id_user'];
- å€ããµãŒãããŒãã£ã©ã€ãã©ãªãå€ããã³ããŒã§ã¯ããµãŒãããŒãã£ã®ã©ã€ãã©ãªã®ããŒãžã§ã³ããã©ããŒããŠãã人ã¯èª°ãããŸããã§ãããã¡ãªã¿ã«ãåãComposerã䜿çšãã代ããã«ãåã«ãããžã§ã¯ãã«ã³ããŒãããŠããŸãããããã«ããããã®ãµãŒãããŒãã£ã®äŸåé¢ä¿ã®äžéšã¯ã«ã¹ã¿ãã€ãºãããŠããŸãã
- ãŠãŒã¶ãŒãã¹ã¯ãŒãã®å®å
šã§ãªãä¿ç®¡ããã¹ã¯ãŒãã®ä¿åã«ã¯ãä¿¡é Œæ§ã®äœãæå·åæ©èœã䜿çšãããŠããŸããã
$sql = " SELECT id, firstname, lastname FROM user WHERE id=%d AND password=PASSWORD('%s') ;"; $result = $db->query(sprintf($sql, $_SESSION['user']['id'], $_POST['pass']));
- CSRFã®è匱æ§ãCSRFããŒã¯ã³ã§ä¿è·ããããã©ãŒã ã¯ãããŸããã
- ãã«ãŒããã©ãŒã¹æ»æã«å¯Ÿããä¿è·ã®æ¬ åŠãããã¯ãã ããã«ãããŸããã§ãããçªå·ã
ããã§äœåºŠãç¶ããããšãã§ããŸããããããã®åé¡ã¯çè§£ããã®ã«ååã§ããã·ã¹ãã ã«æ·±å»ãªåé¡ããã£ãããããèªäœãæ·±å»ãªåé¡ã§ããã
3.ã³ãŒãã®ä¿å®ãšæ¡åŒµãå°é£ã§ãã
ã»ãã¥ãªãã£ã®åé¡ã¯ãã¹ãŠã«éå®ãããŠããŸããã§ãããé©ããããšã«ããããžã§ã¯ãã«ã¯ããŒãžã§ã³ç®¡çã·ã¹ãã ããããŸããã§ãããã³ãŒãã¯å®å šã«æ§é åãããŠããŸããã§ããã WebãµãŒããŒã®ã«ãŒããã£ã¬ã¯ããªã«ã¯ãajax-new.phpãajax2.phpãªã©ã®ãã¡ã€ã«ãå«ãŸããŠããããããã¯ãã¹ãŠã³ãŒãã§äœ¿çšãããŠããŸããããŸããã¬ã€ã€ãŒïŒãã¬ãŒã³ããŒã·ã§ã³ãã¢ããªã±ãŒã·ã§ã³ãããŒã¿ïŒãžã®æç¢ºãªæåããããŸããã§ãããã»ãšãã©ã®å Žåãã³ãŒããã¡ã€ã«ã¯PHPãHTMLãJavaScriptã®æ··åç©ã§ããã
ããããã¹ãŠãããã®ã·ã¹ãã ã®åå§çãªããã¯ãªãã£ã¹ãäœæããããã«äŸé Œããããšããæè¯ã®è§£æ±ºçã¯ãSynataAdminãšçµã¿åãããŠSymfony4ã䞊ã¹ãŠå±éããæ¢åã®ã³ãŒãã«ãŸã£ããè§Šããªãããšã§ãã£ããšããäºå®ã«ã€ãªãããŸãããå»åž«ãæ£è ããã«æ°ããªæ©äŒãäžããããã«èšãããããæéãšåŽåããããããšã¯æããã§ãããããŠãèªåãã¹ãã®è©±ããªãã£ãã®ã§ãäœããå£ãå¯èœæ§ã¯éåžžã«é«ãã§ãããã
ã«ã¯ã»ã³ãã«ã¯æ¿åºã«ãšã£ãŠã¯ãäžèšã®ãã¹ãŠã§ååã§ãããæ°ãããã©ãããã©ãŒã ãéçºããããã®éä¿¡å·ãäžããããŸããã
Doctor Rides-RidesïŒæ°ãããã©ãããã©ãŒã ã®éçºæ¹æ³
å€ããã³ããŒã®çºæ¡ãèŠããšãã§ãããç§ãã¡ã¯æåããæ°ãããã©ãããã©ãŒã ã®éçºã®æºåãå§ããŸããããã®ãããæ°ãããã©ãããã©ãŒã ã®éçºãèš±å¯ããããšããããã«MVPããŒãžã§ã³ã®äœæãéå§ããŸããã 4人ã®PHPãš3人ã®ããã³ããšã³ãéçºè ã®ããŒã ãçŽ3é±éåã§ãã®ã¿ã¹ã¯ã«å¯ŸåŠããŸããããã¹ãŠã®äœæ¥ã¯Symfony5ã§å®è¡ããããããªé話ãšãã£ããã®ã¿ãå§ä»»ãããŸããããããã¯G-CoreMeetãµãŒãã¹ã䜿çšããŠå®è£ ãããŸãããå€ãã·ã¹ãã ã®ããã¯ãªãã£ã¹ã圹ã«ç«ã¡ãŸããããããæ°æ¥ã§MVPã«é©å¿ãããããšãã§ããŸããããã®çµæãã·ã¹ãã ã®MVPããŒãžã§ã³ã¯ãå€ããã©ãããã©ãŒã ã®æ©èœã®80ïŒ ãã«ããŒããŠããŸãããã¡ãªã¿ã«ãããã¯ãã1ã€ã®ã¿ã¹ã¯ã«ã䜿çšãããŸããããæç¹ã§ãã«ã¯ã»ã³ãã«ã¯ã®e-healthãšãŒãžã§ã³ã·ãŒã®ãã«ããã¹ã¯çšã«MVPã®ã¯ããŒã³ãäœæããŸããã管çè ããŠãŒã¶ãŒã«é»è©±ããããããšãã§ããããã«ããŸãã
MVPã®æºåãæŽããšãæ¬æ Œçãªæ°ãããã©ãããã©ãŒã ã®éçºãéå§ããŸãããAPIãã©ãããã©ãŒã ãšReactJSãã¯ã©ã€ã¢ã³ãåŽã®Next.jsãšçµã¿åãããŠãAPIã®åºç€ãšããŠäœ¿çšããŸãããè峿·±ãã¿ã¹ã¯ããªãããã§ã¯ãããŸããã
1.éç¥ã®å®è£
åé¡ã®1ã€ã¯ãéç¥ã§çºçããŸãããAPIã¯ã©ã€ã¢ã³ãã¯ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ãšSPAã®äž¡æ¹ã§ããå¯èœæ§ããããããçµã¿åããããœãªã¥ãŒã·ã§ã³ãå¿ èŠã§ããã
ãŸãã顧客ãSSEïŒServer Sent EventïŒãä»ããŠå¯Ÿè©±ããMercureHubãéžæããŸãããããããAPIãã©ãããã©ãŒã ã®äœæè èªèº«ããã®ãœãªã¥ãŒã·ã§ã³ãã©ã®ããã«å®£äŒãããšããŠããã¢ããªã±ãŒã·ã§ã³ã¯ã¢ã¯ãã£ããªç¶æ ã§ã®ã¿éç¥ãåä¿¡ã§ãããããã¢ãã€ã«ããŒã ã¯ãããæåŠããŸããã
ãã®ããã«ããŠFirebaseã«ã¢ã¯ã»ã¹ããã¢ãã€ã«ããã€ã¹ã§ãã€ãã£ãããã·ã¥éç¥ã®ãµããŒããå®çŸããMercureHubããã©ãŠã¶ã¢ããªã±ãŒã·ã§ã³ã«ä»»ããŸãããããã§ãã·ã¹ãã ã§ã€ãã³ããçºçãããšãMercure Hubã§å¿ èŠãªãã©ã€ããŒããã£ãã«ãä»ããŠãŠãŒã¶ãŒã«ã€ãã³ããéç¥ãããããã«ã¢ãã€ã«ããã€ã¹ã®ããã·ã¥ãFirebaseã«éä¿¡ãããŸãã
Firebaseã«ãã¹ãŠãããã«å®è£ ããªãã£ãã®ã¯ãªãã§ããïŒããã§ã¯ãã¹ãŠãåçŽã§ããWebã¯ã©ã€ã¢ã³ãã®ãµããŒãã«ãããããããPush APIã®ãªããã©ãŠã¶ãŒïŒåãSafariããã³ã»ãšãã©ã®ã¢ãã€ã«ãã©ãŠã¶ãŒïŒã¯ããã§åäœããŸããããã ãããµããŒããããŠãããã©ãŠã¶ã䜿çšããŠãããŠãŒã¶ãŒåãã«ãFirebaseããã®ããã·ã¥éç¥ãå®è£ ããããšãåŒãç¶ãèšç»ããŠããŸãã
2.æ©èœãã¹ã
APIã®æ©èœãã¹ããè¡ã£ãŠãããšãã«ãå¥ã®è峿·±ãç¶æ³ãçºçããŸããããåç¥ã®ããã«ããããããã¯ãªãŒã³ãªç°å¢ã§åäœããã¯ãã§ããããããæ¯åãããŒã¹ãäžããŠåºæ¬çãªãã£ã¯ã¹ãã£ãšãã¹ãã«å¿ èŠãªãã£ã¯ã¹ãã£ãåããã®ã¯ãããã©ãŒãã³ã¹ã®ç¹ã§é«äŸ¡ã§ããããšã倿ããŸããããããåé¿ããããã«ãæåã®æ®µéã§ããšã³ãã£ãã£ãããã³ã°ïŒ
bin/console doctrine:schema:create
ïŒã«åºã¥ããŠããŒã¿ããŒã¹ãäœæã ãæ¬¡ã«åºæ¬çãªãã£ã¯ã¹ãã£ïŒ
bin/console doctrine:fixtures:load
ïŒã远å ããããšã«ããŸãã ã
次ã«ãdama / doctrine-test-bundleæ¡åŒµæ©èœã䜿çšããŠãåãã¹ãã®å®è¡ããã©ã³ã¶ã¯ã·ã§ã³ã«ã©ããããããã¹ãã±ãŒã¹ã®æåŸã«ã³ãããããã«ããŒã«ããã¯ããããšã確èªããŸããããã®ããããã¹ãäžã«ããŒã¿ããŒã¹ã«å€æŽãå ããããŠãããããã¯ã³ãããããããå®è¡åŸã®ããŒã¿ããŒã¹ã¯PHPUnitãèµ·åãããåãšåãç¶æ ã®ãŸãŸã«ãªããŸãã
ãšã³ããã€ã³ãããšã«å°ãªããšã1ã€ã®ãã¹ããäœæãããããã«ãèªåã¬ãã¥ãŒãã¹ããäœæããŸãããç»é²ãããŠãããã¹ãŠã®ã«ãŒããæ€åºãããããã®ãã¹ãããã§ãã¯ããŸãããããã£ãŠãããšãã°ãapp_appointment_createã«ãŒãã®å Žåããã©ã«ããŒã«ãå«ãŸããŠãããã©ããã確èªããŸã
tests/Functional/App/Appointment CreateTest.php
ã
ããã«ãã³ãŒãã®å質ã¯ãphpstan-strict-rulesãªã©ã®æ¡åŒµæ©èœãåããPHP-CS-Fixerãphp-cpdãããã³PHPStanã«ãã£ãŠç£èŠãããŸãã
3.ã¯ã©ã€ã¢ã³ãåŽ
å»åž«ãšæ£è ã®ããã«ãåãUIãšåæ§ã®æ©èœãåãã2ã€ã®ç¬ç«ããã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ãäœæããŸããããããã®æ©èœãšUIã®åå©çšã確ç«ããããã«ãã©ã€ãã©ãªãšã¢ããªã±ãŒã·ã§ã³ãå«ãã¢ããªããžããªã䜿çšããããšã«ããŸãããåæã«ãã¢ããªã±ãŒã·ã§ã³èªäœã¯äºãã«ç¬ç«ããŠæ§ç¯ããã³ãããã€ãããŸãããåãã©ã€ãã©ãªã«äŸåããŠããå ŽåããããŸãã
ãã®ã¢ãããŒãã«ããã1ã€ã®ãã«ãªã¯ãšã¹ãã§æ©èœïŒã©ã€ãã©ãªïŒãäœæãããããå¿ èŠãªãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã«çµ±åã§ããŸãããã®å©ç¹ã«ãããå¥ã ã®npmã©ã€ãã©ãªãšç°ãªããªããžããªã®ãããžã§ã¯ãã«æ©èœãå®è£ ãã代ããã«ãã¢ããªããžããªã䜿çšããããšã«ãªããŸããã
ã¢ããªããžããªãæ§æããã«ã¯ãns.jsã©ã€ãã©ãªã䜿çšããŸããããã«ãããããã¯ã¹ããReactããã³Next.jsã®ã©ã€ãã©ãªãšã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ãããããžã§ã¯ãã§äœ¿çšãããã®ã¯ãã®ã¹ã¿ãã¯ã§ããESLintãšPrettierã䜿çšããŠã³ãŒãå質ã远跡ããJestã䜿çšããŠåäœãã¹ããäœæããReact TestingLibraryã䜿çšããŠReactã³ã³ããŒãã³ãããã¹ãããŸãã
å»è ãå°çããŸããïŒæåŸã«äœãèµ·ãã£ãã®ã
ããã5ãæã§ãã¹ãŠã®åé¡ã解決ãããæ°ãããã©ãããã©ãŒã ããã¹ãŠã®ããã€ã¹ã®ãŠãŒã¶ãŒã«å©çšå¯èœã«ãªããŸããããµãŒãã¹ã®WebããŒãžã§ã³ãšãiOSããã³Androidçšã®ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ãæºåããŸããã
ãã®ãµãŒãã¹ã«ããã4ãæä»¥äžã«ããããæ£è ã¯å»åž«ãæ¯ç§å»ãããªã³ã©ã€ã³ã§çžè«ãåããããšãã§ããŸãããããã¯ããªãŒãã£ãªåœ¢åŒãšãããªåœ¢åŒã®äž¡æ¹ã§å®è¡ã§ããŸãããã®çµæãå»åž«ã¯åŠæ¹ç®ãäœæããå»çèšé²ã𿀿»çµæãæ£è ãšå®å šã«å ±æããŸãã
ãã®ãã©ãããã©ãŒã ã¯ãã«ã¯ã»ã³ãã«ã¯ã®ãã¹ãŠã®å»çå°éå®¶ãå± äœè ãããã³åŽåè ãå©çšã§ããŸããçŸåšã圌女ã¯åœå ã§æå€§ã®2ã€ã®å»çæ©é¢ã§ããç é¢ã§åããŠããŸãããããŒã«ã·ã¥ãŒãã³ïŒãªãããŒãããŒã«ã·ã¥ãŒãã³ïŒãšç é¢ã»ã³ã¿ãŒããšããŒã«ã¡ãªã·ã¥ïŒã»ã³ã¿ãŒãã¹ãã¿ãªãšãšããŒã«ã¡ãªã·ã¥ïŒããã®ãµãŒãã¹ã¯ãã«ã¯ã»ã³ãã«ã¯EDH TierIVããŒã¿ã»ã³ã¿ãŒã®G-CoreLabsã¯ã©ãŠãã®å®å šãªå Žæã«å°å ¥ãããå¿ èŠãªä»æ§ã«åŸã£ãŠä»®æ³ç°å¢ãæ§æãããŸãã