PHP ์–ธ์–ด์šฉ ์ •์  ๋ถ„์„๊ธฐ์ธ ์‹œํŽธ 3.12๊ฐ€ ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. PHP 8.0์˜ ์•ŒํŒŒ ๋ฆด๋ฆฌ์Šค

๋น„๋ฉ”์˜ค ํšŒ์‚ฌ ะพะฟัƒะฑะปะธะบะพะฒะฐะปะฐ ์ •์  ๋ถ„์„๊ธฐ์˜ ์ƒˆ๋กœ์šด ๋ฆด๋ฆฌ์Šค ์‹œ 3.12๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด PHP ์ฝ”๋“œ์˜ ๋ช…๋ฐฑํ•˜๊ณ  ๋ฏธ๋ฌ˜ํ•œ ์˜ค๋ฅ˜๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ผ๋ถ€ ์œ ํ˜•์˜ ์˜ค๋ฅ˜๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์‹œ์Šคํ…œ์€ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์™€ PHP์˜ ์ƒˆ๋กœ์šด ๋ถ„๊ธฐ์— ๋„์ž…๋œ ์ตœ์‹  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ ๋ชจ๋‘์—์„œ ๋ฌธ์ œ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋Š” PHP๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ ๋ฐฐํฌ์ž MIT ๋ผ์ด์„ผ์Šค์— ๋”ฐ๋ผ.

์‹œํŽธ์€ ์ž˜๋ชป๋œ ์œ ํ˜• ์‚ฌ์šฉ๊ณผ ๊ด€๋ จ๋œ ๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ์ „ํ˜•์ ์ธ ์‹ค์ˆ˜. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ‘œํ˜„์‹์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๋ณ€์ˆ˜ ํ˜ผํ•ฉ, ์ž˜๋ชป๋œ ๋…ผ๋ฆฌ ํ…Œ์ŠคํŠธ(์˜ˆ: "if ($a && $a) {}", "if ($a && !$a) {}" ๋ฐ " if ( $a) {} elseif ($a) {}"), ๊ฐ์ฒด ์†์„ฑ์˜ ์ดˆ๊ธฐํ™”๊ฐ€ ๋ถˆ์™„์ „ํ•ฉ๋‹ˆ๋‹ค. ๋ถ„์„๊ธฐ๋Š” ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ๋ชจ๋“œ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ๊ฒ€์‚ฌ ์ดํ›„ ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ๋งŒ ๋ถ„์„ํ•˜๋Š” ์ฆ๋ถ„ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ณด์•ˆ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋„๊ตฌ๊ฐ€ ์ œ๊ณต๋˜์–ด ์‚ฌ์šฉ ํ˜•์‹์˜ ์ฃผ์„ ๋ฌธ์„œ๋ธ”๋ก ("/** @var Type */")์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜ ์œ ํ˜•, ๋ฐ˜ํ™˜ ๊ฐ’, ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ๊ฐœ์ฒด ์†์„ฑ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜• ์‚ฌ์šฉ ํŒจํ„ด ์ •์˜ ๋ฐ Assert ๋ฌธ ์‚ฌ์šฉ๋„ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

/** @var ๋ฌธ์ž์—ด|๋„ */
$a = foo();

/** @var ๋ฌธ์ž์—ด $a */
echo strpos($a, '์•ˆ๋…•ํ•˜์„ธ์š”');

/** @psalm-assert-if-true B $a */
ํ•จ์ˆ˜ isValidB(A $a) : bool {
B && $a->isValid()์˜ $a ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
}

๋ฐœ๊ฒฌ๋œ ๋ฌธ์ œ๋ฅผ ์ž๋™์œผ๋กœ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ง€์›ํ•˜๋Š” Psalter ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ์ผ๋ฐ˜์ ์ธ ์ฝ”๋“œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ์œ ํ˜• ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๊ณ , ํด๋ž˜์Šค๋ฅผ ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ์ด๋™ํ•˜๊ณ , ํด๋ž˜์Šค ๊ฐ„ ๋ฉ”์„œ๋“œ๋ฅผ ์ด๋™ํ•˜๊ณ , ํด๋ž˜์Šค์™€ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ๋“ฑ์˜ ์กฐ์ž‘์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์‹œํŽธ์˜ ์ƒˆ๋กœ์šด ํ˜ธ์—์„œ ๊ตฌํ˜„ "--taint-analytic" ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜(์˜ˆ: $_GET['name'])์™€ ๋ฌธ์ž ์ด์Šค์ผ€์ดํ”„๊ฐ€ ํ•„์š”ํ•œ ์œ„์น˜(์˜ˆ: echo ")์—์„œ์˜ ์‚ฌ์šฉ ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. $name ")(์ค‘๊ฐ„ ํ• ๋‹น ๋ฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ์ถ”์  ์ฒด์ธ ํฌํ•จ) $_GET, $_POST ๋ฐ $_COOKIE ์—ฐ๊ด€ ๋ฐฐ์—ด์˜ ์‚ฌ์šฉ์€ ์ž ์žฌ์ ์œผ๋กœ ์œ„ํ—˜ํ•œ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋กœ ๊ฐ„์ฃผ๋˜์ง€๋งŒ ๊ทธ๋Ÿด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ์ • ์ž์‹ ์˜ ์†Œ์Šค. ์ด์Šค์ผ€์ดํ”„ ์ถ”์ ์ด ํ•„์š”ํ•œ ์ž‘์—…์—๋Š” HTML ์ฝ˜ํ…์ธ ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜, HTTP ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ถœ๋ ฅ ์ž‘์—…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๊ฒ€์ฆ์€ echo, exec, include, header ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด์Šค์ผ€์ดํ”„ ํ•„์š”์„ฑ์„ ๋ถ„์„ํ•  ๋•Œ ํ…์ŠคํŠธ, SQL, HTML ๋ฐ ์…ธ ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋œ ๋ฌธ์ž์—ด, ์ธ์ฆ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋œ ๋ฌธ์ž์—ด๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค. ์ œ์•ˆ๋œ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด XSS(๊ต์ฐจ ์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฝํŒ…) ๋˜๋Š” SQL ๋Œ€์ฒด๋กœ ์ด์–ด์ง€๋Š” ์ฝ”๋“œ์˜ ์ทจ์•ฝ์„ฑ์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ ์ฃผ๋ชฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์ถœ๋ฐœ ์ƒˆ๋กœ์šด PHP 8.0 ๋ธŒ๋žœ์น˜์˜ ์•ŒํŒŒ ํ…Œ์ŠคํŠธ. ๋ฐœ๋งค๋Š” 26์›” XNUMX์ผ๋กœ ์˜ˆ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ ๋ถ„๊ธฐ์—์„œ๋Š” ๋‹ค์Œ์ด ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. ํ˜์‹ ์œผ๋กœ :

  • ์ „์› ์ผœ๊ธฐ JIT ์ปดํŒŒ์ผ๋Ÿฌ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์‚ฐ์„ฑ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.
  • ์ง€์› ๋…ธ๋™์กฐํ•ฉ ์ข…๋ฅ˜, ๋‘ ๊ฐœ ์ด์ƒ์˜ ์œ ํ˜• ์ปฌ๋ ‰์…˜์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: "public function foo(Foo|Bar $input): int|float;").
  • ์ง€์› ์†์„ฑ Docblock ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(์˜ˆ: ์œ ํ˜• ์ •๋ณด)๋ฅผ ํด๋ž˜์Šค์— ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ๋Š” (์ฃผ์„)
  • ๋‹จ์ถ•๋œ ๊ตฌ๋ฌธ ํด๋ž˜์Šค ์ •์˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์„ฑ์ž ์ •์˜์™€ ์†์„ฑ์„ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ๋ฐ˜ํ™˜ ์œ ํ˜• - ์ •์  ์ธ.
  • ์ƒˆ๋กœ์šด ์œ ํ˜• - ํ˜ผํ•ฉ ๋œ, ์ด๋Š” ํ•จ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ‘œํ˜„ ๋˜์ ธ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ์œ„ํฌ๋งต ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘ ์ค‘์— ํฌ์ƒ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ๋ถˆํ•„์š”ํ•œ ์บ์‹œ ์ €์žฅ).
  • ๊ธฐํšŒ ๊ฐ์ฒด์— ๋Œ€ํ•ด "::class" ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(get_class() ํ˜ธ์ถœ๊ณผ ์œ ์‚ฌ).
  • ๊ธฐํšŒ ๋ณ€์ˆ˜์— ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š์€ ์˜ˆ์™ธ์˜ catch ๋ธ”๋ก์— ์ •์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐํšŒ ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ ๋’ค์— ์‰ผํ‘œ๋ฅผ ๋‚จ๊น๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค ์ŠคํŠธ๋ง ๊ฐ€๋Šฅ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž์—ด ์œ ํ˜•์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค(์ด ๊ฒฝ์šฐ __toString() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ).
  • ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ str_contains(), ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์˜ ๋ฐœ์ƒ์„ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•œ strpos์˜ ๋‹จ์ˆœํ™”๋œ ์œ ์‚ฌ์ฒด, ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘๊ณผ ๋์—์„œ ์ผ์น˜ ํ•ญ๋ชฉ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ str_starts_with() ๋ฐ str_ends_with() ํ•จ์ˆ˜.
  • ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ fdiv(), XNUMX์œผ๋กœ ๋‚˜๋ˆŒ ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ๋‚˜๋ˆ„๊ธฐ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณ€๊ฒฝ๋จ ๋ฌธ์ž์—ด ๊ฒฐํ•ฉ ๋…ผ๋ฆฌ. ์˜ˆ๋ฅผ ๋“ค์–ด 'echo "sum:" ํ‘œํ˜„์‹์ž…๋‹ˆ๋‹ค. $a + $b'๋Š” ์ด์ „์—๋Š” 'echo ("sum: " . $a) + $b'๋กœ ํ•ด์„๋˜์—ˆ์ง€๋งŒ PHP 8์—์„œ๋Š” 'echo "sum: " ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ($a + $b)'.
  • ์กฐ์—ฌ์ง ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฐ์ˆ  ๋ฐ ๋น„ํŠธ ์—ฐ์‚ฐ์„ ํ™•์ธํ•˜๋ฉด "[] % [42]" ๋ฐ "$object + 4" ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ๊ตฌํ˜„ ์—ฌ๋Ÿฌ ์‹คํ–‰์—์„œ ๋™์ผํ•œ ๊ฐ’์˜ ์ˆœ์„œ๊ฐ€ ์œ ์ง€๋˜๋Š” ์•ˆ์ •์ ์ธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€