safe::loadTk — 안전한 인터프리터에 Tk 불러오기
safe::loadTk — 안전한 인터프리터에 Tk 불러오기
안전(safe) 인터프리터에서도 Tk를 쓸 수 있게 하려면 어떻게 해야 할까요? 외부에서 가져온 코드를 신뢰할 수 없을 때 자동 로딩과 패키지 접근을 제한하고 중재해 주는 Safe Tcl을 바탕으로, Safe Tk는 인터프리터를 안전한 Tk 작업에 맞게 설정하고 Tk를 안전한 인터프리터에 불러옵니다.
본문
개요
safe::loadTk child ?-use windowId? ?-display displayName?
동작 방식
safe::loadTk 명령은 이름이 주어진 안전 인터프리터에 필요한 자료 구조를 초기화한 뒤 Tk를 그 안에 불러옵니다. 인터프리터는 safe::interpCreate로 만들어졌거나 safe::interpInit으로 초기화되어 있어야 해요. 명령은 안전 인터프리터의 이름을 돌려줍니다.
-use를 지정하면, 시스템 의존 식별자 windowId로 식별되는 창이 안전 인터프리터의 . 창을 담는 데 사용됩니다. 그 값은 유효한 어떤 id여도 되고, 결국 다른 응용에 속한 창을 가리킬 수도 있어요. 편의상 사용하려는 창이 해당 응용의 Tk 창이라면 window id(예: winfo id .x.y) 대신 창 이름(예: .x.y)을 쓸 수 있습니다. -use를 지정하지 않으면 안전 인터프리터의 . 창을 위해 새 toplevel 창이 만들어져요. X11에서 임베드된 창이 기본 디스플레이가 아닌 다른 디스플레이를 쓰게 하려면 -display로 지정하세요. 구현 세부 사항은 아래 보안 문제 섹션을 참조해요.
보안 문제
Safe Tcl의 기본 보안 고려 사항은 safe 매뉴얼 페이지를 읽어보세요.
safe::loadTk는 부모 인터프리터에서 가져온 tk_library 값을 안전 인터프리터의 가상 접근 경로에 추가해서, 안전 인터프리터에서 자동 로딩이 동작하도록 해줍니다.
Tk 초기화는 이제 자식의 상태를 시작 시점에 신뢰하지 않는 점에서 안전해요. safe::loadTk는 자식의 이름을 등록해서, Tk 초기화(Tk_SafeInit)가 호출되고 그 안에서 부모의 safe::InitTk가 호출될 때 원하는 argv 값(-use windowId, 올바른 -display 등)을 돌려주도록 합니다.
-use를 쓰지 않으면 새로 만들어진 toplevel은 특별히 장식됩니다. 그래서 사용자는 제시된 사용자 인터페이스가 잠재적으로 안전하지 않은 코드에서 온 것임을 항상 알아채고, 해당 인터프리터를 쉽게 삭제할 수 있어요.
X11에서 서로 충돌하는 -use와 -display는 치명적인 X 오류를 일으킬 가능성이 있습니다.