구문 변환기의 기능
JSON, YAML, XML, TOML 및 CSV는 동일한 내용을 보유하지 않습니다. 이 페이지에는 각 모양이 매핑되는 방식, 손실이 있는 변환, 도구에서 수행을 거부하는 작업이 정확하게 설명되어 있습니다.
그것이 무엇을 변환하는가
9가지 직접 변환: JSON에서 YAML로, YAML에서 JSON으로, JSON에서 XML로, XML에서 JSON으로, JSON에서 TOML로, TOML에서 JSON으로, YAML에서 TOML로, TOML에서 YAML로, JSON에서 CSV로. 모든 것은 브라우저 탭에서 실행됩니다. 아무것도 업로드되지 않았습니다.
각 변환은 내부적으로 동일한 방식으로 작동합니다. 즉, 소스 문서를 일반 JavaScript 값으로 읽고 해당 값을 대상 형식으로 기록합니다. YAML에서 TOML로의 변환은 특별한 경우가 아니며 YAML 판독기와 TOML 작성기입니다. 그렇기 때문에 아래의 주의 사항은 쌍이 아닌 형식별로 명시되어 있습니다. TOML 날짜 시간에 대한 주의 사항은 TOML이 나타날 때마다 적용됩니다.
CSV는 쓰기 전용이며 의도적으로 그렇습니다. CSV를 읽는다는 것은 구분 기호, 인용 방언, 첫 번째 행이 헤더인지 여부, 모든 셀의 유형을 추측하는 것을 의미합니다. 4개의 추측이 있는데 각각 변환기는 조용히 오류를 범합니다. 그것은 묻는 도구에 대한 작업입니다.
XML: 우리가 선택한 속성, 배열 및 규칙
XML에는 표준 JSON 매핑이 없으므로 규칙을 선택해야 했습니다. XML이 두 가지 형식 중 하나일 때마다 화면에 표시됩니다.
속성은 @ 접두사가 붙은 객체 키가 됩니다. <user id="7"><name>Ada</name></user>는 {"user":{"@id":"7","name":"Ada"}}로 읽습니다. 접두사는 동일한 이름의 속성과 하위 요소가 하나의 키로 축소되는 것을 방지하는 것입니다. <user id="7"><id>other</id></user>는 두 가지를 모두 유지합니다.
속성이나 하위 요소도 포함하는 요소 내부의 텍스트는 #text 키 아래에 있습니다. 텍스트만 포함하는 요소는 해당 텍스트로 축소됩니다. CDATA 섹션은 #cdata 아래에 있으므로 해당 내용은 마크업이 아닌 시각적 데이터입니다.
반복되는 형제 요소는 배열이 됩니다. 한 번 나타나는 요소 이름은 배열이 되지 않습니다. XML은 파서에게 "단일 값"과 "하나의 항목이 있는 목록"을 구분할 수 있는 방법을 제공하지 않으며 어떤 변환기도 해당 정보를 만들어낼 수 없습니다. 안정적인 모양이 필요한 경우 이는 더 영리한 변환기가 아니라 스키마에 대한 주장입니다.
네임스페이스 접두사는 그대로 유지됩니다. <ns:item>는 키 ns:item이고 xmlns:ns는 @xmlns:ns 속성입니다. 접두사를 확인하면 문서에 실제로 포함된 텍스트가 삭제되기 때문에 아무것도 확인되거나 다시 작성되거나 제거되지 않습니다.
자체 닫는 태그는 빈 문자열로 읽혀집니다. XML 선언, 처리 지침 및 주석이 삭제됩니다. 반대로 말하면 도구는 DOCTYPE이 아닌 자체 선언을 작성합니다.
유효한 XML 요소 이름이 아닌 키(공백이 있는 키, 숫자로 시작하는 키, xml 문자로 시작하는 키)를 XML로 작성하는 것은 자동으로 다시 작성되지 않고 이름으로 거부됩니다. 조용히 이름이 변경된 요소는 아무것도 검증하지 않는 문서를 생성합니다.
외부 엔터티는 단순히 비활성화되는 것이 아니라 거부됩니다.
XML 문서는 DOCTYPE의 엔터티를 선언할 수 있습니다. 이를 확장하는 파서는 XXE 취약점입니다. SYSTEM "file:///etc/passwd"로 선언된 엔터티는 로컬 파일을 읽고, URL을 가리키는 엔터티는 공격자가 제어하는 요청을 만들고, 내부 엔터티 체인은 수백 바이트를 기가바이트로 변환하는 "수억 웃음" 서비스 거부입니다.
이 변환기는 DOCTYPE에 주의하도록 파서를 구성하지 않습니다. 파서에 단일 바이트가 제공되기 전에 거부를 해제할 수 있는 옵션이 없으면 이를 포함하는 모든 문서를 거부합니다. 이는 보장을 종속성의 기본 설정이 아닌 코드의 속성으로 만듭니다. 그리고 차이점이 중요합니다. 왜냐하면 버전 간 기본값 변경과 우리 자신의 거부는 모든 표준 XXE 페이로드에 피드를 제공하고 아무것도 가져오지 않았고 아무것도 확장되지 않았다고 주장하는 테스트에 의해 다루어지기 때문입니다.
실질적인 비용: DOCTYPE이 포함된 문서는 무해한 경우에도 여기에서 변환되지 않습니다. 콘텐츠가 귀하의 것이라면 DOCTYPE을 삭제하세요.
TOML 날짜/시간은 다른 곳에서는 동등한 것이 없습니다
TOML 1.0에는 네 가지 임시 유형이 있고 JSON, YAML 및 XML에는 없음: 오프셋 날짜-시간(1979-05-27T07:32:00Z), 로컬 날짜-시간(1979-05-27T07:32:00, 의도적으로 영역 없음), 현지 날짜(1979-05-27) 및 현지 시간 (07:32:00).
각각은 작성된 대로 정확히 RFC 3339 문자열이 되며, 변환을 통해 어떤 값에 해당 작업을 수행했는지, 그리고 각각 어떤 종류인지 알려줍니다. 네 가지 모두에 대해 단일 UTC 순간을 내보내는 대안은 현지 시간을 문서에서 명시적으로 거부한 영역으로 이동하는데, 이는 손실이 있는 답변이 아니라 잘못된 답변입니다.
다시 변환하면 날짜/시간이 아닌 인용된 문자열이 생성됩니다. 따라서 TOML에서 JSON으로 TOML로의 왕복은 해당 값의 유형을 변경합니다. 수신 도구가 공유해야 하는 규칙을 고안하지 않고서는 이 문제를 해결할 수 없으며 자동으로 고안하는 것은 더 나쁠 것입니다.
TOML 정수는 64비트로 서명됩니다. JSON 숫자는 IEEE-754 두 배입니다. 2^53 - 1 이후의 정수는 눈에 띄지 않을 반올림으로 마지막 숫자를 잃지 않고 경고에 경로 이름이 지정된 문자열이 됩니다.
TOML에는 null이 없습니다. null 키는 출력에서 생략되고 경고에 이름이 지정됩니다. 배열 내부의 null은 빈 문자열이 됩니다. 이를 제거하면 이후의 모든 인덱스가 이동하기 때문입니다. TOML 문서의 루트는 항상 테이블이므로 루트에 있는 배열이나 베어 값은 이유를 묻는 문장으로 거부됩니다.
YAML: 앵커, 스트림 및 노르웨이 문제
YAML은 문자열, 숫자, 부울, Null, 목록 및 맵만 생성할 수 있는 제한된 스키마로 읽혀집니다. 임의의 객체를 구성하는 태그(!!js/function, !!python/object/apply, !!binary)는 거부됩니다. 이것이 제한이 존재하는 이유입니다. 태그를 존중하는 로더는 구성 파일의 옷을 입은 임의의 객체 생성자입니다.
앵커와 별칭은 반복 데이터로 확인됩니다. 별칭을 따르면 백만 값을 초과하여 확장되는 문서는 탭을 고정하는 것이 허용되지 않고 거부됩니다. 순환 별칭은 여기서 다른 형식으로 순환을 표현할 수 없기 때문에 완전히 거부됩니다.
---로 구분된 여러 문서의 스트림은 문서의 배열이 되며 변환에서는 그렇게 말합니다. 이 도구에는 스트림이 있는 다른 형식이 없으므로 배열이 유일한 정직한 매핑입니다.
YAML은 반복되는 매핑 키를 금지하며 모든 파서가 키를 다르게 처리합니다. 이 도구는 마지막 값(JSON.parse이 사용하는 규칙)을 유지하고 반복 위치와 함께 해당 일이 발생했음을 알려줍니다. 문서를 조용히 폐기하는 것은 더 나쁩니다. 말하지 않고 조용히 값을 선택하는 것은 더 나쁠 것입니다.
노르웨이 문제: YAML 1.1에서 따옴표가 없는 스칼라 y, yes, on, no, off 및 국가 코드 NO는 모두 부울로 해석됩니다. 이는 국가 코드 목록이 참과 거짓 목록으로 바뀌는 방법입니다. 이 도구는 YAML 1.2를 읽습니다. 여기서 true와 false만 부울이므로 NO는 문자열 NO를 유지합니다. YAML를 쓰면 1.1 파서가 잘못 읽을 수 있는 모든 문자열을 인용합니다('NO', 'yes', 'on', '1.0', '0755', '2001-12-14'). 따라서 출력은 다음과 같은 도구에 공급하는 것이 안전합니다. 1.2로 이동되지 않았습니다. 몇 개의 인용 문자가 필요하고 정확성을 구매합니다.
숫자처럼 보이는 문자열은 같은 이유로 따옴표를 유지합니다. "0755"은 755이 되지 않고 문자열로 유지되고 "1.0"는 1이 되지 않고 문자열로 유지됩니다.
댓글은 모든 방향에서 손실됩니다. JSON, CSV 등은 저장할 곳이 없으며 다시 돌아와야 할 위치를 추측할 방법도 없습니다.
JSON에서 CSV로: 병합 및 수식을 중지하는 아포스트로피
배열은 요소당 하나의 레코드로 이루어진 행이 됩니다. 단일 속성이 배열을 보유하는 객체는 해당 배열을 행으로 사용합니다. 왜냐하면 {"users": [ ... ]}는 압도적으로 레이블이 있는 테이블이기 때문입니다. 그리고 변환에서는 그렇게 했다고 큰 소리로 말합니다. 다른 모든 개체는 단일 행입니다. 문자열, 숫자 또는 null은 거부됩니다. 직사각형에는 레코드가 필요합니다.
중첩된 개체와 배열은 점으로 구분된 열 이름으로 평면화되며, 개체 키와 배열 인덱스 모두에 점이 있습니다(address.city, tagged.0, tagged.1). 하나의 구분 기호, 하나의 규칙. 이미 점이 포함된 키는 중첩된 경로로 인해 열 이름이 모호해집니다. 이 도구는 스프레드시트가 이해할 수 없는 이스케이프 방식을 고안하는 대신 경고합니다.
키는 처음 표시된 순서대로 모든 행에서 결합됩니다. 필드가 누락된 행은 이동된 열이 아닌 빈 셀을 가져오고 변환 시 행이 불규칙하다는 경고를 표시합니다. 빈 객체나 빈 배열은 사라지지 않고 자체 경로 아래에 하나의 빈 셀이 됩니다.
인용은 RFC 4180를 따릅니다. 구분 기호, 큰따옴표, CR 또는 LF가 포함된 필드는 큰따옴표로 묶이고 포함된 인용문은 두 번 작성됩니다. 레코드는 CRLF로 구분됩니다. 선행 또는 후행 공백이 있는 필드도 인용됩니다. 왜냐하면 스프레드시트가 자동으로 공백을 잘라내기 때문입니다. 유니코드는 변경되지 않고 전달되며 UTF-8를 읽는 데 필요한 스프레드시트의 경우 바이트 순서 표시가 앞에 붙을 수 있습니다.
포뮬러 주입은 물린 것입니다. =, +, -, @로 시작하는 셀, 탭 또는 캐리지 리턴은 파일이 열리는 순간 Excel, LibreOffice Calc 및 Google Sheets에서 수식으로 실행됩니다. =cmd|'/c calc'!A1은 모두가 인용하는 데모입니다. =IMPORTXML(...)은 시트를 조용히 어딘가로 보내는 것입니다. 이러한 문자열을 그대로 작성하는 변환기는 귀하의 데이터를 비활성으로 보이는 파일에서 다른 사람의 코드 실행으로 변환했습니다.
따라서 해당 문자 중 하나로 시작하는 텍스트 셀에는 아포스트로피가 붙습니다. 모든 주요 스프레드시트는 "이것은 텍스트입니다"로 읽히고 셀에는 표시되지 않습니다. 숫자는 그대로 남습니다. 숫자 -5는 공식이 아니라 숫자입니다. 이스케이프된 셀 수가 보고되고 이스케이프 기능을 끌 수 있습니다. 이 경우 도구는 방금 끈 내용을 명확하게 알려줍니다.
CSV는 빈 문자열과 null을 구별할 수 없습니다. 둘 다 빈 셀이 되며 변환 시 null이 계산되어 발생했음을 알 수 있습니다.
한계, 그리고 한계에 도달하면 어떻게 되나요?
모든 형식에는 파서가 다운로드되기 전에 적용되는 문자 한도가 있습니다. JSON의 경우 8백만, XML의 경우 4백만, CSV 소스의 경우 YAML 및 TOML의 경우 2백만입니다. 그 외에도 도구는 붙여넣은 내용을 잃어버리는 응답하지 않는 탭이 되는 대신 정확한 숫자를 거부합니다.
CSV 출력은 추가로 100,000 행 및 2,000 열로 제한됩니다. 깊이 중첩된 배열은 요소당 하나의 열로 평면화되고 몇 메가바이트의 JSON은 스프레드시트가 열리지 않는 테이블이 될 수 있기 때문입니다.
비어 있고 공백만 있는 입력은 null 또는 빈 문서로 변환되지 않고 빈 것으로 보고됩니다. 읽을 수 있는 네 가지 형식 모두에서 행과 열이 포함된 잘못된 구문이 보고됩니다.
파서 자체는 변환에 필요할 때만 다운로드됩니다. JWT를 디코딩하기 위해 툴킷을 열면 아무 것도 가져오지 않습니다.
붙여넣은 내용은 어떻게 되나요?
- 모든 변환, 해시, 디코드 및 차이점은 브라우저 탭에서 실행됩니다. 페이지가 로드된 후에는 관련된 서버가 없기 때문에 입력이 서버에 업로드되거나 기록되거나 저장되지 않습니다.
- 해시는 브라우저의 자체 웹 암호화 구현에서 나오고 UUID는 암호화된 보안 무작위 생성기에서 나옵니다. 둘 다 네트워크 호출과 관련이 없습니다.
- 귀하가 입력하는 내용은 로컬 저장소나 쿠키에 기록되지 않습니다. 페이지를 다시 로드하면 페이지가 삭제됩니다. 탭을 닫으면 삭제됩니다.
- 사이트 전체 분석은 구성된 정식 프로덕션 호스트에서만 실행되며 개인정보 보호정책에 공개됩니다. 로컬 및 미리보기 호스트는 이를 거부합니다. 붙여넣은 값, 토큰, URL 및 파일 내용은 ToolAcre 자체 분석 이벤트에서 제외됩니다. 현재 구성에서는 광고가 비활성화되어 있습니다.
- 즉, JWT 또는 API 키는 실시간 자격 증명입니다. 안전한 습관은 자신이 작성하지 않은 웹 페이지에 내용을 붙여넣지 않는 것입니다. 이 내용을 포함하여 그 주장은 신뢰할 만합니다.
질문
내 XML 문서가 "DOCTYPE 선언"과 함께 실패하는 이유는 무엇입니까?
문서 유형 선언이 포함되어 있고 이 변환기는 엔터티를 안전하게 처리하기 위해 파서 설정을 신뢰하는 대신 모든 항목을 거부하기 때문입니다. 콘텐츠가 귀하의 것이라면 DOCTYPE을 삭제하세요. 이를 허용할 수 있는 옵션이 없습니다.
내 TOML 날짜 시간이 인용된 문자열로 반환된 이유는 무엇입니까?
JSON, YAML 및 XML에는 날짜 유형이 없기 때문입니다. 날짜/시간은 작성된 RFC 3339 텍스트(다른 모든 형식의 문자열)로 변환되었습니다. 따라서 다시 변환하면 문자열이 생성되며, 도구는 나중에 알 수 있도록 하는 대신 발생하는 순간에 경고합니다.
내 CSV 셀 중 하나가 아포스트로피로 시작하는 이유는 무엇입니까?
텍스트가 =, +, -, @, 탭 또는 캐리지 리턴으로 시작하고 스프레드시트는 파일을 열 때 이러한 셀을 수식으로 실행하기 때문입니다. 아포스트로피는 셀을 텍스트로 표시합니다. 셀을 읽은 후에는 값의 일부가 아닙니다. 이스케이프 기능을 끄면 도구에서 그 의미를 알려줍니다.
반복되는 단일 XML 요소가 배열이 아닌 이유는 무엇입니까?
왜냐하면 XML은 하나의 값 목록과 단일 값을 구별할 수 있는 방법을 제공하지 않기 때문입니다. 둘 다 동일하게 작성되었습니다. 어느 방향으로든 추측하는 것은 절반의 시간 동안 잘못된 것이므로 도구는 실제로 무엇이 있는지 보고합니다.
여기에서 CSV를 다시 JSON으로 변환할 수 있나요?
아니요. CSV를 올바르게 읽으려면 구분 기호, 인용 방언, 첫 번째 행이 헤더인지 여부와 모든 셀의 유형을 결정해야 합니다. 4개 모두 틀렸다고 조용히 추측하는 변환기는 틀릴 수 있는 최악의 방법입니다. 묻는 CSV 도구를 사용하십시오.
"NO"가 false로 변환되지 않는 이유는 무엇입니까?
해당 동작은 YAML 1.1에 속하고 이 도구는 YAML 1.2를 읽습니다. 여기서 true와 false만 부울입니다. 1.1 동작은 노르웨이의 국가 코드가 구성 관리에서 농담을 하는 이유입니다. 도구가 YAML를 작성할 때 해당 문자열을 인용하므로 다운스트림의 1.1 파서도 해당 문자열을 잘못 읽을 수 없습니다.
제한사항
- CSV는 작성되었으나 읽혀지지 않았습니다. 여기서는 선택에 따라 CSV에서 JSON으로의 변환이 없습니다.
- 댓글은 모든 방향, 모든 형식에서 손실됩니다.
- TOML 날짜/시간은 다른 모든 형식의 문자열이 되므로 TOML 왕복은 해당 유형을 변경합니다. 무손실 경로는 없습니다.
- DOCTYPE을 포함하는 XML 문서는 무해한 문서를 포함하여 완전히 거부되며 거부를 해제할 수 없습니다.
- 단일 반복 XML 요소는 반복되지 않는 요소와 구별할 수 없으므로 XML에서 JSON, XML로의 변환은 항상 원래 모양을 반환하지 않습니다.
- XML 혼합 콘텐츠(하위 요소와 인터리브된 텍스트)는 하위 요소를 기준으로 텍스트의 위치를 잃으며 왕복할 수 없습니다.
- XML은 유형을 선언하지 않기 때문에 유형 추론이 켜지지 않는 한 XML 값은 문자열입니다. 추론을 통해 "0755" 및 "NO"는 일반적으로 잘못 해석될 수 있습니다.
- TOML에는 null이 없습니다. null 키는 TOML 출력에서 삭제되고 배열 내부의 null은 빈 문자열이 됩니다.
- TOML 문서의 루트는 테이블이어야 하므로 JSON 배열이나 스칼라는 전혀 TOML로 변환될 수 없습니다.
- JSON 숫자는 IEEE-754 두 배입니다. 2^53 이후의 정수는 자동으로 반올림되어 유형이 변경되는 대신 문자열로 변환됩니다.
- CSV는 빈 문자열과 null을 구별할 수 없습니다. 둘 다 빈 셀로 기록됩니다.
- CSV 병합은 객체 키와 배열 인덱스 모두에 점을 사용하므로 이미 점이 포함된 키는 경고는 되지만 이스케이프되지는 않는 모호한 열 이름을 생성합니다.
- YAML 앵커 및 별칭은 보존되지 않고 확인됩니다. 출력에는 앵커가 없으며 순환을 표현할 수 있는 대상 형식이 없기 때문에 재귀적 별칭이 거부됩니다.
- 입력은 형식별로 제한됩니다. JSON의 경우 8백만 자, XML의 경우 4백만 자, YAML 및 TOML의 경우 2백만 자 — 크기가 큰 문서는 느리게 처리되기보다는 거부됩니다.
- 여기서는 스키마에 대해 유효성을 검사하는 항목이 없습니다. 문서가 깔끔하게 변환되더라도 해당 목적에 맞지 않을 수 있습니다.