2012-11-21 3 views
0

루아에서는 어떻게 테이블을 읽기 전용으로 만듭니 까? (특히 LuaInterface와 C#은 5.1이지만, 아무 것도 바뀌지 않을 것이라고 생각합니다.) __index__newindex을 사용하는 방법을 알고 있지만 누군가가 실행되는 것을 막지는 못합니다 : math = nil 잠재적으로 추가 스크립트가 발생할 수 있습니다. 잘못 실행됩니다.루아는 테이블을 읽기 전용으로 만듭니다

내 현재의 "보호"기능 :

function protect(table) 
return setmetatable({}, { __index = table, 
__newindex = function(table, key, value) error("attempted to modify a read only table")   
end, __metatable = false }) end 

math = protect(math) 
math.sqrt = nil // successfully protected 
math = nil // this is bad and can happen! 
+1

사용중인 루아 버전을 언급하지 않았습니다. 이 경우에는 관련이 있습니다. – Mud

+0

원래 게시물 – user1840819

답변

5

글로벌 환경 그냥 테이블입니다. 루아 5.1에서 모든 함수 (컴파일 된 루아 스크립트가 무엇인지)는 으로 변경할 수있는 자체 환경을 가지고 있습니다. 전역 테이블을 수정할 수 없도록 샌드 박스 스크립트를 사용하려는 경우 으로 바꾸고 샌드 박스로 대체하십시오.

기본적으로 사용자가 액세스 할 수 있도록하려는 항목을 넣은 읽기 전용 테이블을 만듭니다. 기존 요소를 덮어 쓰지 않고 현재 존재하지 않는 항목을 수정할 수 있도록 메타 테이블을 설정할 수도 있습니다 (예 : 자신의 전역을 만들고 사용할 수 있음).

사용자의 능력을 rawget/rawset으로 제거하지 않으면 항상 샌드 박스를 백 도어하여 이러한 테이블을 손상시킬 수 있습니다.

더 안전한 버전은 기능을 복사하여 각 스크립트에 대한 환경을 구축하는 것입니다. 모든 스크립트가 같은 math 테이블을 얻는 대신, 스크립트가 만질 수없는 곳에서 당신이 싫어하는 원본 복사본을 얻습니다.

+0

을 업데이트했습니다. 내 현재 샌드 박스 코드는 실제로 다음과 같습니다. http://pastebin.com/1kzCGztL (태그 사용을 무시하고 컴파일되지 않았습니다.) 나는 "LuaManager"가 있습니다. LuaManager.RunFile ("filename")을 호출하여 스크립트를 실행합니다. 이 경우 전역 변수를 어떻게 숨길 수 있습니까? setfenv 작동합니까? – user1840819

관련 문제