한국어

HTML, chmod, 컨테이너 및 cron

네 가지 유틸리티 뒤에 있는 이유: HTML 편집기에 허용 목록과 샌드박스가 필요한 이유, chmod 문자열의 대문자 S가 중요한 이유, docker run 명령이 Compose에서 표현할 수 없는 내용, 모든 사람을 포착하는 두 가지 크론 규칙.

HTML 편집기: 필터가 아닌 허용 목록

편집기는 HTML을 생성하며, 텍스트 상자에서 나온 HTML은 현존하는 가장 오래된 삽입 벡터입니다. 여기서는 두 가지 다른 질문이 혼동되므로 분리할 가치가 있습니다. 첫 번째는 "이 편집기를 속여서 이를 표시하는 페이지에서 코드를 실행하는 마크업을 내보낼 수 있습니까?"입니다. 두 번째는 "이것이 신뢰할 수 없는 소스에서 적대적인 HTML을 정리하는 안전한 방법입니까?"입니다. 이 도구는 첫 번째 질문에는 '예', 두 번째 질문에는 '아니요'라고 대답하며, 사용자가 다르게 가정할 수 있도록 하기보다는 패널에 그렇게 표시합니다.

메커니즘은 허용 목록입니다. 요소 목록이 허용됩니다. 다른 모든 요소는 풀리므로 텍스트는 유지되지만 태그는 유지되지 않습니다. 요소별로 속성 목록이 허용됩니다. 다른 모든 것은 삭제되므로 단순히 차단되는 것이 아니라 모든 이벤트 핸들러가 불가능해집니다. 해당 테스트 전에 속성 이름은 소문자로 표시되므로 oNeRrOr 및 ONERROR는 onerror와 동일한 거부 이름입니다. HTML 파서가 원시 텍스트로 처리하는 콘텐츠(스크립트, 스타일, 텍스트 영역, iframe, 제목)가 있는 요소는 콘텐츠와 함께 제거됩니다. 이러한 요소를 래핑 해제하면 스크립트 소스가 마크업으로 문서에 붙여넣기 때문입니다.

링크 주소는 자체적으로 확인됩니다. 값은 해당 체계를 읽기 전에 엔터티 디코딩되고 공백 및 제어 문자가 제거됩니다. 이는 브라우저가 탐색할 때 수행하는 작업이기 때문입니다. javascript:alert(1) 및 jav ascript:alert(1) 둘 다 동일한 위치에 도달합니다. http, https, mailto, tel, ftp 및 상대 주소만 유지됩니다. 도구가 확인할 수 없는 문자 참조(:는 고전적임)로 인해 전체 주소가 통과되지 않고 거부됩니다. 브라우저보다 입력을 덜 이해하는 필터는 구멍이 있는 필터이기 때문입니다.

이미지 버튼도 없고 img도 허용 목록에 없습니다. 허용되는 이미지 태그는 문서가 끝나는 곳에서 발생하는 아웃바운드 요청이자 오류 발생 표면입니다. 산문을 만드는 편집자에게도 가치가 없습니다.

이 중 어느 하나도 완벽하지 않은 방어가 바로 프리뷰다. 스크립트, 양식, 동일 출처 액세스 등 아무것도 부여하지 않는 샌드박스 속성을 사용하여 iframe에서 렌더링합니다. 페이로드가 허용 목록에서 살아남은 경우에도 브라우저는 여전히 해당 페이로드 실행을 거부합니다. 이는 우리 코드에 대한 약속이라기보다는 구조적 보증입니다.

정직한 한계: 이것은 완전한 HTML5 파서가 아닌 문자열 기반 삭제 도구입니다. 파서 차이(브라우저가 이 토크나이저와 다른 트리를 구축하는 입력)는 이러한 방식으로 구축된 모든 새니타이저의 알려진 약점입니다. 출력의 경우 이 편집기에서 직접 생성하면 괜찮습니다. 낯선 사람으로부터 도착한 HTML을 정리하려면 제어하는 ​​서버에서 실제 파서에 대해 실행되는 살균기를 사용하십시오.

Chmod: 대문자가 전체 메시지입니다

Unix 파일 모드는 12비트입니다. 소유자, 그룹 및 기타 각각에 대한 3개의 권한 비트와 setuid, setgid 및 고정 비트가 포함됩니다. 8진수 형식은 해당 비트를 직접 읽는 것이므로 4 + 2 + 1 = 7는 읽기, 쓰기 및 실행을 의미합니다.

ls가 인쇄하는 기호 형식은 특수 비트가 흥미로운 부분입니다. 왜냐하면 고유한 열을 갖지 않기 때문입니다. setuid는 소유자 실행 문자를 대체하고, setgid는 그룹 실행 문자를 대체하며, 고정은 다른 실행 문자를 대체합니다. 기본 실행 비트도 설정되어 있으면 문자는 소문자이고 그렇지 않으면 대문자입니다.

따라서 4755은 실행 가능한 setuid 프로그램인 rwsr-xr-x이고, 4644은 누구도 실행할 수 없는 setuid 파일인 rwSr--r--입니다. 대문자 S는 비트가 비활성임을 알려주는 시스템이며 거의 항상 선택이 아닌 실수입니다. rw-r--r-T를 표시하는 1644에도 동일하게 적용됩니다. 일반 파일의 고정 비트로서 다른 실행 비트가 지워져 있으며 최신 커널에서는 아무 작업도 수행하지 않습니다.

똑바로 유지할 가치가 있는 두 가지 차이점이 더 있습니다. 9자 문자열 ls가 인쇄하는 것은 chmod가 취하는 인수가 아닙니다. chmod는 u=rwx,g=rx,o=rx,u+s와 같은 할당 목록을 원합니다. 그리고 동일한 비트는 파일과 디렉터리에서의 다른 의미를 의미합니다. 실행은 "입력 및 탐색 가능"을 의미하고, setgid는 "새 파일이 이 그룹을 상속함"을 의미하며, 고정 비트는 "누구나 만들 수 있고 소유자만 삭제할 수 있음"을 의미합니다. 이것이 /tmp가 1777인 이유입니다.

docker run to compose: 구문 분석 및 변환되지 않는 것

변환기는 이 도구용으로 작성된 인용 인식 토크나이저로 명령을 분할합니다. 아무것도 실행되거나 평가되거나 쉘에 전달되지 않습니다. 백틱, $(...) 또는 세미콜론이 포함된 명령은 리터럴 문자로 읽혀집니다. 왜냐하면 이 도구가 입력에 대해 수행하는 유일한 작업은 입력 내용을 읽는 것이기 때문입니다.

대부분의 플래그는 명확하게 매핑됩니다. 즉, 포트, 볼륨, 환경, 레이블, 다시 시작 정책, 기능, 상태 확인, 리소스 제한, DNS 및 추가 호스트에는 모두 동일한 의미의 작성 키가 있습니다. 명명된 볼륨과 사용자 정의 네트워크에는 서비스 참조뿐만 아니라 최상위 선언도 필요하므로 출력에는 external: true가 포함되어 있습니다. 네트워크 docker 실행이 이미 존재하는 것이기 때문에 네트워크에서는 true입니다.

일부 플래그에는 Compose와 동등한 기능이 없으며, 이는 변환기가 일반적으로 조용히 실패하는 경우입니다. --rm은 서비스 속성이 아닙니다. 작성 서비스는 종료 시 제거되지 않습니다. -d는 서비스가 무엇인지가 아니라 CLI를 호출한 방법을 설명합니다. --link는 레거시이며, --mount에는 이 도구가 작성하지 않는 긴 형식이 필요합니다. --gpus는 드라이버에 따라 다릅니다. 이들 각각은 사라지는 대신 명명된 경고를 생성합니다. 알 수 없는 플래그도 경고를 생성하며 값을 갖지 않는 것으로 간주됩니다. 왜냐하면 플래그가 걸렸다고 추측하면 이미지 이름이 인수로 바뀌고 확실하게 잘못된 파일이 생성되기 때문입니다.

출력에는 최상위 버전인 key가 없습니다. Compose v2는 이를 무시하고 현재 버전에서는 이에 대해 경고합니다. Compose 사양이 이전 파일 형식 버전을 대체한 이후로 더 이상 사용되지 않습니다.

인용은 장식적인 것이 아닙니다. 따옴표 없이 8080:80로 작성된 포트 매핑은 YAML 1.1 파서에 의해 숫자로 읽혀지며 yes, no, on 및 off는 동일한 방언의 부울입니다. 잘못 읽을 수 있는 내용은 모두 인용됩니다. 문자열로 깔끔하게 읽는 모든 항목은 그대로 유지되므로 파일을 계속 읽을 수 있습니다.

Cron: 모두를 사로잡는 두 가지 규칙

첫 번째는 요일 규칙입니다. 날짜와 요일이 모두 *가 아닌 다른 값으로 설정된 경우 cron은 둘 중 하나가 일치할 때 작업을 실행합니다. 둘 다 일치할 때가 아닙니다. 따라서 0 0 13 * 5은 "13일 자정 및 매주 금요일 자정"입니다. 이는 1년에 한두 번인 "13일 금요일"이 아니라 한 달에 약 5번입니다. 생성기는 두 필드가 모두 제한될 때마다 경고하며, 작성하는 문장은 "and" 대신 "or"로 표시됩니다.

두 번째는 시간대입니다. Cron은 실행되는 머신의 영역을 사용합니다. 이는 서버에서 UTC인 경우가 많으며 crontab을 작성하는 사람의 영역은 거의 사용하지 않습니다. 따라서 다음 실행 미리 보기에서는 사용자의 영역을 가정하는 대신 사용할 영역을 묻습니다. 시간은 해당 구역에서 벽시계 시간으로 계산되므로 일일 작업은 일광 절약 시간제 변경 기간 동안 한 시간씩 차이가 나지 않고 동일한 현지 시간으로 유지됩니다. 그리고 존재하지 않는 현지 시간(매년 봄 건너뛰는 시간)은 목록에서 제외됩니다. 그 이유는 크론도 그때 실행되지 않기 때문입니다.

구문 자체는 작습니다. 별표, 숫자, 범위 a-b, 목록 a,b,c, 단계 */n 또는 a-b/n, 및 월 및 요일 이름 JAN-DEC 및 SUN-SAT. 0 및 7은 모두 일요일을 의미합니다. 분 필드의 5/15와 같은 단계가 있는 기본 값은 "5부터 범위 끝까지, 매 15"(분 5, 20, 35 및 50)을 의미합니다.

유효성 검사는 의도적으로 엄격합니다. 60 * * * * 분이 59에서 중지되기 때문에 거부됩니다. * * * * 8는 날짜 필드가 7에서 중지되기 때문에 거부됩니다. */0 * * * * 0 단계는 아무것도 일치하지 않으므로 거부됩니다. 6개 필드는 일반적으로 첫 번째 필드가 초인 Quartz 또는 systemd 표현식을 의미하므로 오류에서는 계산만 하는 것이 아니라 이렇게 말합니다. 구문적으로는 유효하지만 실행될 수 없는 일정( 0 0 30 2 *은 2월 30일을 요청함)은 수락되고 표시됩니다. 이를 거부하는 것은 잘못된 일이고 침묵을 지키는 것이 더 나쁠 것이기 때문입니다.

붙여넣은 내용은 어떻게 되나요?

  • 모든 변환, 해시, 디코드 및 차이점은 브라우저 탭에서 실행됩니다. 페이지가 로드된 후에는 관련된 서버가 없기 때문에 입력이 서버에 업로드되거나 기록되거나 저장되지 않습니다.
  • 해시는 브라우저의 자체 웹 암호화 구현에서 나오고 UUID는 암호화된 보안 무작위 생성기에서 나옵니다. 둘 다 네트워크 호출과 관련이 없습니다.
  • 귀하가 입력하는 내용은 로컬 저장소나 쿠키에 기록되지 않습니다. 페이지를 다시 로드하면 페이지가 삭제됩니다. 탭을 닫으면 삭제됩니다.
  • 사이트 전체 분석은 구성된 정식 프로덕션 호스트에서만 실행되며 개인정보 보호정책에 공개됩니다. 로컬 및 미리보기 호스트는 이를 거부합니다. 붙여넣은 값, 토큰, URL 및 파일 내용은 ToolAcre 자체 분석 이벤트에서 제외됩니다. 현재 구성에서는 광고가 비활성화되어 있습니다.
  • 즉, JWT 또는 API 키는 실시간 자격 증명입니다. 안전한 습관은 자신이 작성하지 않은 웹 페이지에 내용을 붙여넣지 않는 것입니다. 이 내용을 포함하여 그 주장은 신뢰할 만합니다.

질문

적대적인 HTML을 편집기에 붙여넣어 정리할 수 있나요?

붙여넣을 수는 있지만 아무 것도 실행되지 않습니다. 붙여넣기 처리기는 항목이 삽입되기 전에 클립보드 페이로드를 삭제하고 미리보기는 허용 스크립트가 없는 샌드박스 iframe입니다. 그러나 결과를 신뢰할 수 없는 입력에 대한 보안 제어로 사용하지 마십시오. 이는 범용 XSS 필터가 아닌 한 편집자의 자체 출력에 대한 문자열 기반 허용 목록이며, 브라우저의 파서는 이와 같은 토크나이저와 다른 트리에 도달할 수 있습니다. 신뢰할 수 없는 콘텐츠의 경우 실제 HTML5 파서를 사용하여 서버에서 삭제하세요.

편집자가 내 이미지와 표를 삭제하는 이유는 무엇입니까?

허용 목록에 없기 때문입니다. 이미지는 아웃바운드 요청이자 오류 발생 표면입니다. 테이블은 단순히 이 편집기의 용도를 벗어났습니다. 텍스트 콘텐츠는 유지되지만 태그는 유지되지 않습니다. 이는 버그라기보다는 작동하는 허용 목록입니다. 그러나 이것은 복잡한 기존 문서를 편집하는 데 적합한 도구가 아니라는 의미입니다.

chmod 4644에 대문자 S가 표시되는 이유는 무엇입니까?

setuid가 설정되어 있고 소유자 실행 비트가 설정되어 있지 않기 때문입니다. 대문자는 특수 비트가 아무 작업도 수행할 수 없음을 의미합니다. 즉, 실행할 수 없는 setuid 파일입니다. 소문자 s는 두 비트가 모두 설정되었음을 의미합니다. 동일한 규칙은 setgid에 대해 S를 제공하고 고정 비트에 대해 T를 제공하며 이를 거꾸로 얻는 것은 모드 계산기에서 가장 일반적인 오류 중 하나입니다.

Docker 변환기가 내 명령을 실행합니까?

아니요, 그럴 수도 없습니다. 명령은 인용만 이해하고 다른 것은 이해하지 못하는 토크나이저에 의해 분할됩니다. 평가판, 셸, 하위 프로세스가 없습니다. 페이지에서 프로세스를 시작할 방법이 없습니다. 붙여넣은 모든 내용은 탭에 그대로 유지됩니다.

변환기가 처리할 수 없는 플래그를 삭제하는 대신 경고를 표시하는 이유는 무엇입니까?

원래 명령보다 자동으로 더 적은 작업을 수행하는 작성 파일은 출력이 전혀 없는 것보다 더 나쁩니다. 프로덕션에서 이를 알게 됩니다. 표시되지 않은 모든 플래그에는 이름이 지정되어 있으며 이에 대해 수행할 작업이 나와 있습니다. 경고가 표시되지 않으면 아무것도 손실되지 않은 것입니다.

다음 크론 실행이 내 서버의 실행과 다른 이유는 무엇입니까?

거의 항상 시간대입니다. Cron은 이를 실행하는 머신의 영역을 사용합니다. 미리보기는 드롭다운에서 선택한 영역을 사용합니다. 이를 서버 영역(종종 UTC)으로 설정하면 동의해야 합니다. 다른 후보는 날짜 규칙입니다. 날짜와 요일이 모두 설정되면 cron은 대부분의 사람들이 의도한 것보다 더 자주 실행됩니다.

제한사항

  • HTML Sanitiser는 이 편집기의 자체 출력에 대한 허용 목록으로, 전체 HTML5 파서가 아닌 문자열 토큰화기로 구현됩니다. 이는 범용 XSS 필터가 아니므로 하나로 사용해서는 안 됩니다.
  • 편집기에는 이미지, 표, 색상 또는 글꼴 컨트롤이 없으며 이를 추가할 방법도 없습니다. 허용 목록 외부의 모든 항목은 제거됩니다.
  • 편집 화면에서는 더 이상 사용되지 않으며 구현된 대체 항목이 없는 document.execCommand를 사용합니다. 브라우저는 여전히 이를 지원합니다. 동작은 특히 목록 중첩과 관련하여 약간 다릅니다.
  • chmod 계산기는 12개의 권한 비트만 다룹니다. 액세스 제어 목록, 확장 속성, SELinux 컨텍스트, umask 산술 및 Windows ACL은 모두 범위를 벗어납니다.
  • docker 변환기는 단일 docker run 명령을 단일 서비스로 변환합니다. Dockerfile을 읽지 않고, 이미지를 확인하지 않으며, --mount, --gpus, --device, --link 또는 --volumes-from을 표현할 수 없습니다. 각각은 대신 명명된 경고를 생성합니다.
  • 변환기가 인식하지 못하는 플래그는 값을 갖지 않는 것으로 간주됩니다. 그러한 플래그가 하나를 취하면 값이 잘못 읽힐 것입니다. 경고에 그렇게 나와 있으므로 플래그를 제거하면 해결됩니다.
  • cron 생성기는 5개 필드로 구성된 crontab 형식만 읽습니다. 6개 필드 Quartz 및 systemd 표현식, @reboot 및 비표준 L, W, # 및 ? 연산자는 추측되기보다는 거부됩니다.
  • 다음 실행 시간은 Intl을 통해 브라우저의 자체 시간대 데이터베이스에서 가져옵니다. 이는 미리보기일 뿐 보장은 아닙니다. cron을 실행하는 머신에는 다른 영역, 다른 데이터베이스 버전이 있을 수 있거나 특정 시점에 실행되지 않은 데몬이 있을 수 있습니다.