programing

문자열 "XML safe"는 어떻게 만드나요?

goodsources 2022. 12. 29. 20:34
반응형

문자열 "XML safe"는 어떻게 만드나요?

PHP 에코를 통해 XML 문서를 전송하여 AJAX 호출에 응답합니다.이 XML 문서를 작성하기 위해 데이터베이스의 레코드를 루프합니다.문제는 데이터베이스에 '<' 기호가 있는 레코드가 포함되어 있다는 것입니다.따라서 당연히 브라우저는 특정 지점에 오류를 발생시킵니다.어떻게 고칠 수 있을까요?

PHP 5.4에서는 다음을 사용할 수 있습니다.

htmlspecialchars($string, ENT_XML1);

다음과 같이 인코딩을 지정해야 합니다.

htmlspecialchars($string, ENT_XML1, 'UTF-8');

갱신하다

위의 경우 변환되는 것은 다음뿐입니다.

  • &로로 합니다.&amp;
  • <로로 합니다.&lt;
  • >로로 합니다.&gt;

큰따옴표로 둘러싸인 속성에서 사용하기 위해 텍스트를 이스케이프하는 경우:

htmlspecialchars($string, ENT_XML1 | ENT_COMPAT, 'UTF-8');

"로로 합니다.&quot;에에 to in &,< ★★★★★★★★★★★★★★★★★」>.


속성이 작은 따옴표로 둘러싸인 경우:

htmlspecialchars($string, ENT_XML1 | ENT_QUOTES, 'UTF-8');

'로로 합니다.&apos;에에 to in &,<,> ★★★★★★★★★★★★★★★★★」".

(물론 Atribut외에서도 사용할 수 있습니다).


htmlspecialchars 에 대해서는, 메뉴얼의 엔트리를 참조해 주세요.

를 사용하여 이러한 문자를 이스케이프하거나, 보다 적절하게는 DOMDocument 또는 XMLWriter 등의 XML 문서를 작성하기 위해 라이브러리를 사용합니다.

다른 방법으로는 섹션을 , CDATA의 ]]>.

또한 XML 문서에 대해 정의한 인코딩(기본값 UTF-8)을 준수해야 합니다.

1) 다음과 같이 텍스트를 CDATA로 래핑할 수 있습니다.

<mytag>
    <![CDATA[Your text goes here. Btw: 5<6 and 6>5]]>
</mytag>

http://www.w3schools.com/xml/xml_cdata.asp 를 참조해 주세요.

2) 이미 누군가가 말했듯이:그 검댕이들을 피해라.예:

5&lt;6 and 6&gt;5

이것을 시험해 보세요.

$str = htmlentities($str,ENT_QUOTES,'UTF-8');

'필터링하다'를 사용해서 를 필터링을 한 htmlentities()로 사용할 수 있습니다.

<mytag>$str</mytag>

가능하면 문자열 조작이 아닌 XML 클래스를 사용하여 XML을 작성하는 것이 좋습니다.이 중 하나의 장점은 필요에 따라 클래스가 자동으로 문자를 이스케이프한다는 것입니다.

누군가에게 도움이 될지도 모르니까 이걸 추가하는 것.

일본어 문자를 사용하고 있기 때문에 인코딩도 적절히 설정되어 있습니다. 그런 생각이 요.htmlentities ★★★★★★★★★★★★★★★★★」htmlspecialchars충분하지 않습니다.

일부 사용자 입력에는 위의 기능으로 제거되지 않은 특수 문자가 포함되어 있습니다.이 경우 다음을 수행해야 합니다.

preg_replace('/[\x00-\x1f]/','',htmlspecialchars($string))

한 것것은 this this this this this this 。xml-unsafe를 제어하다Null character또는EOT. 이 를 사용하여 생략할 문자를 결정할 수 있습니다.

나는 Golang이 XML을 위해 이스케이프를 인용하는 방식을 선호한다(그리고 newline 이스케이프, 다른 문자 이스케이프 등 몇 가지 추가 사항). 그래서 나는 아래의 PHP에 XML 이스케이프 함수를 포팅했다.

function isInCharacterRange(int $r): bool {
    return $r == 0x09 ||
            $r == 0x0A ||
            $r == 0x0D ||
            $r >= 0x20 && $r <= 0xDF77 ||
            $r >= 0xE000 && $r <= 0xFFFD ||
            $r >= 0x10000 && $r <= 0x10FFFF;
}

function xml(string $s, bool $escapeNewline = true): string {
    $w = '';

    $Last = 0;
    $l = strlen($s);
    $i = 0;

    while ($i < $l) {
        $r = mb_substr(substr($s, $i), 0, 1);
        $Width = strlen($r);
        $i += $Width;
        switch ($r) {
            case '"':
                $esc = '&#34;';
                break;
            case "'":
                $esc = '&#39;';
                break;
            case '&':
                $esc = '&amp;';
                break;
            case '<':
                $esc = '&lt;';
                break;
            case '>':
                $esc = '&gt;';
                break;
            case "\t":
                $esc = '&#x9;';
                break;
            case "\n":
                if (!$escapeNewline) {
                    continue 2;
                }
                $esc = '&#xA;';
                break;
            case "\r":
                $esc = '&#xD;';
                break;
            default:
                if (!isInCharacterRange(mb_ord($r)) || (mb_ord($r) === 0xFFFD && $Width === 1)) {
                    $esc = "\u{FFFD}";
                    break;
                }

                continue 2;
        }
        $w .= substr($s, $Last, $i - $Last - $Width) . $esc;
        $Last = $i;
    }
    $w .= substr($s, $Last);
    return $w;
}

이 때문에 적어도 PHP7.2가 필요합니다.mb_ord사용방법이나 다른 폴리필로 교환해야 하는데, 이 기능들은 우리에게 매우 효과적입니다!

궁금하신 분들을 위해 관련 Go 소스 https://golang.org/src/encoding/xml/xml.go?s=44219:44263#L1887를 소개합니다.

언급URL : https://stackoverflow.com/questions/3426090/how-do-you-make-strings-xml-safe

반응형