2010-01-22 4 views
3

신뢰할 수없는 출처에서 제공 한 문자열에서 쉽고 안전하게지도를 파싱하는 방법을 찾고 있습니다. 지도에는 키워드와 숫자가 포함되어 있습니다. 이렇게하려면 read을 사용하는 보안 문제는 무엇입니까?안전하게지도를 클로저로 구문 분석

답변

5

read은 기본적으로 완전히 안전하지 않으므로 임의의 코드가 실행될 수 있습니다. 예를 들어 (read-string "#=(println \"hello\")")을 시도하십시오.

*read-eval*을 false로 바인딩하면 더 안전하게 만들 수 있습니다. 이로 인해 #= 표기법이 사용되면 예외가 트리거됩니다. 예를 들어 : (: foo는 : 막대)

(binding [*read-eval* false] (read-string "#=(println \"hello\")"))

마지막으로, 당신이 그것을 사용하는 방법에 따라하는 것은 다수의 키워드를 제공하여 서비스 공격의 잠재적 인 거부가있다. 키워드는 인턴되고 해제되지 않습니다. 따라서 충분한 양의 프로세스가 사용되면 메모리가 부족합니다. clojure-dev 목록에 관한 내용은 some discussion입니다.

2

안전하고 싶다면 기본적으로 평가없이 수동으로 구문 분석해야한다고 생각합니다. 지원하려는

(apply hash-map 

    (map #(%1 %2) 

     (cycle [#(keyword (apply str (drop 1 %))) 

       #(Integer/parseInt %)]) 

     (string/split ":a 23 :b 32 :c 32" #" "))) 

번호의 종류에 따라 당신이 원하는 얼마나 많은 오류 검사는 이상 순환되고있는 두 가지 기능을 수정하기를 원할 것입니다 : 여기에 한 가지 방법의 예는 그것을 할 것입니다 다른 모든 값을 키워드 또는 숫자로 처리합니다.