마 젠토 2 : 템플릿 보안 : 어떤 방법을 사용해야합니까?


29

Magento 2에는 템플릿을 보호하는 데 사용할 수있는 몇 가지 방법이 있습니다.

  • $block->escapeHtml()
  • $block->escapeQuote()
  • $block->escapeUrl()
  • $block->escapeXssInUrl()

그러나 각 방법을 언제 사용해야하는지 궁금합니다.

답변:


35

AbstractBlock모든 델리게이트 에서 이스케이프 메소드는에 대한 호출을 수행 Magento\Framework\Escaper하므로 개요를 찾을 수 있습니다.

공개 메소드와 그 문서를 봅시다 :

escapeHtml ()

/**
 * Escape string for HTML context. allowedTags will not be escaped, except the following: script, img, embed,
 * iframe, video, source, object, audio
 *
 * @param string|array $data
 * @param array|null $allowedTags
 * @return string|array
 */
public function escapeHtml($data, $allowedTags = null)

이것은 모든 출력에 대한 기본 이스케이프 방법이어야합니다. "Html"을 포함하지 않는 모든 메소드의 결과는 이스케이프되어야합니다.

escapeHtmlAttr ()

(마 젠토 2.2 이후 )

/**
 * Escape a string for the HTML attribute context
 *
 * @param string $string
 * @param boolean $escapeSingleQuote
 * @return string
 */
public function escapeHtmlAttr($string, $escapeSingleQuote = true)

예를 들어 HTML 속성 내에서 출력을 이스케이프하려면이를 사용하십시오.

title="<?php echo $block->escapeHtmlAttr($title) ?>"

HTML을 이스케이프하지만 따옴표 ( ")도

기본적으로 작은 따옴표도 이스케이프 처리되므로 다음과 같이 작동합니다.

onclick="alert('<?php echo $block->escapeHtmlAttr($message) ?>')"

원하지 않는 경우 두 번째 매개 변수를 false로 설정하십시오.

escapeUrl ()

/**
 * Escape URL
 *
 * @param string $string
 * @return string
 */
public function escapeUrl($string)

URL을 출력하는 데 사용할 수 있습니다. 그것은 기본 HTML 이스케이프와 추가로 제거합니다 적용됩니다 javascript:, vbscript:data:. 사용자 제공 링크에서 이와 같은 URL을 방지하려면이 방법을 사용할 수 있습니다.

Magento 2.1까지이 기능은 포함되어 있지 않으므로 escapeXssInUrl()대신 사용해야 합니다. 전혀 사용할 이유가 없었 escapeUrl()습니다.

그렇지 않으면 $block->escapeHtmlAttr()URL 에만 사용하십시오 .

encodeUrlParam ()

(마 젠토 2.2 이후 )

/**
 * Encode URL
 *
 * @param string $string
 * @return string
 */
public function encodeUrlParam($string)

URL 인코딩을 매개 변수에 적용합니다. 내부 URL의 getUrl()경우 URL 인코딩이 이미 수행 된 경우 항상을 사용해야 하므로 수동으로 외부 URL을 생성하는 경우에만 필요합니다.

escapeJs ()

(마 젠토 2.2 이후 )

/**
 * Escape string for the JavaScript context
 *
 * @param string $string
 * @return string
 */
public function escapeJs($string)

JavaScript의 유니 코드 문자를 인코딩합니다 (예 : 가 됨) \u2665. JS 문자열 내에서 출력을 이스케이프 처리하는 데 사용하십시오 . 인라인 자바 스크립트 (예 : onclick속성)의 경우 여전히을 호출해야합니다 escapeHtmlAttr().

를 사용하는 경우 json_encode()이미 동일한 이스케이프를 수행하므로이 경우에는 escapeJs()사용하지 않아야합니다.

escapeCss ()

(마 젠토 2.2 이후 )

/**
 * Escape string for the CSS context
 *
 * @param string $string
 * @return string
 */
public function escapeCss($string)

CSS의 유니 코드 문자를 인코딩합니다 ( escapeJs()예 : contentCSS 속성에 사용).

더 이상 사용되지 않는 방법 (Magento 2.2 기준) :

  • escapeJsQuote : escapeHtmlAttr()대신 사용
  • escapeXssInUrl : escapeUrl()대신 사용
  • escapeQuote : escapeHtmlAttr()대신 사용

1
잘 했어 2.1을 사용할 때 답을 언급하기 위해 대답에 약간의 메모를 추가했습니다. 흥미롭게도 Magento U couse는 내가 언급 한 방법에 대해서만 언급합니다. 나는 코스가 2.0 일 뿐이라고 생각한다
Digital Pianism의 Raphael

escapeHtmlAttr그리고 escapeHtmlAttr2.1.2에 존재하지 않습니다 ... /vendor/magento/framework/Escaper.php그들은 나중에 추가하고 magento 태그를 다시 지정하지 않는 한 적어도 존재하지 않습니다 ..
OZZIE

2
좋은 대답은 실제로 최신 개발 지점을 기반으로 한 대답입니다. devdocs에 따르면 다른 방법은 2.2에서 사용되지 않을 것입니다.
Fabian Schmengler

img 태그가 필요할 수있는 임의의 HTML 청크를 정리하는 데 사용할 수있는 방법이 있습니까?
Corgalore

어떤 의미에서 깨끗합니까?
Fabian Schmengler

14

마 젠토 2.0 용입니다. 2.1은 Fabian의 답변을 참조하십시오

escapeHtml

HTML을 포함하지 않아야하는 문자열 출력의 경우이 기능을 사용하십시오.

예:

<span class='label'><?php echo $block->escapeHtml($block->getLabel()); ?></span>

escapeQuote

HTML 속성의 경우이 기능을 사용하십시오.

예:

<span class="<?php echo $block->escapeQuote($block->getSpanClass()); ?>">Description</span>

escapeUrl

URL 출력의 경우이 기능을 사용하십시오 (XSS 방지없이 문자 변환 만 가능).

예:

<a href="<?php echo $block->escapeUrl($block->getUrl()); ?>">Link</a>

escapeXssInUrl

URL 출력 (XSS 방지-문자 대화 포함)의 경우이 기능을 사용하십시오.

예:

<a href="<?php echo $block->escapeXssInUrl($block->getUrl()); ?>">Link</a>

탈출 할 필요가없는 것은 무엇입니까?

  • 타입 캐스팅과 PHP 함수 count()(예제 echo (int)$var)
  • 작은 따옴표로 출력 (예 echo 'test')
  • 변수없이 큰 따옴표로 출력 (예 echo "test")

__방법

이것은 번역 목적으로 사용됩니다. 문자열을 번역 할 수 있다는 것을 알고있을 때 사용하십시오.

예를 들면 다음과 같습니다.

<caption class="table-caption"><?php /* @escapeNotVerified */ echo __('More Information') ?></caption>

잘 했어. rapheal
미트 베라

1
모든 번역 __()도 피해야 합니까? 나는 /* @escapeNotVerified */어디에나 붙여 넣기에 약간 지쳤다 : /
igloczek

@BartekIgielski는 업데이트 된 답변을 봅니다. __보안을위한 것이 아니라 번역을위한 것
Digital Pianism의 Raphael

1
또한 번역 된 문자열을 피하는 것이 좋습니다echo $this->escapeHtml(__('Text to translate'))
KAndy

2
devdocs 페이지에는 현재 일부 메소드가 2.2에서 더 이상 사용되지 않을 것이라는 메모가 있습니다. 템플릿 보안 페이지에서 다시 확인하십시오. devdocs.magento.com/guides/v2.0/frontend-dev-guide/templates/…
Anna Völkl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.