2013-06-11 9 views
5

belirterek sınırlamak istiyorum. Yapılandırma için "veri olarak kod" fikrini seviyorum çünkü vaka sınıflarından aldığınız doğrulama bir yapılandırma dosyası için istediğinizle aynı doğrulamadır. Twitter bunu kolaylaştıran güzel bir Eval yardımcı programı yazdı (https://github.com/twitter/util). Kullanıcıların yapılandırma dosyalarını bir uzak servise yüklemelerine izin vermek istiyorum. Bu, uzaktan servisime karşı kod enjekte etme potansiyelini açar. ÖrneğinTwitter'ın Scala Eval'ı kodlama kodunu engellemek için nasıl zorlayabilirsiniz? Eval parametrelerini

, aşağıdaki yapılandırma vaka sınıf varsa: Ben kullanıcı komutunu içeren bir dosya yüklemek mümkün olmak istiyorum

case class MyConfig(param1: String) 

:

MyConfig(param1 = "My Param Value") 

... ama

MyConfig(param1 = {import someDangerousPackage; someDangerousCommand(); "My Param Value"}) 

emin hayır yapmak için derleme yolunu kesmek için bir yol var mı: bir dosya değil komutu içeren işlevler çağrılıyor?

+3

Eğer halihazırda vaka sınıflarına sahipseniz, neden config dosyası için typesafe konfigürasyonunu kullanıp oradan ayıklamıyorsunuz? – drexin

+1

http://code.google.com/p/scalascriptengine/ adresine bir göz atın. Bazı temel güvenlik seçenekleri sağladığını düşünüyorum – vitalii

+0

Bir Typesafe Config HOCON dosyası kullanarak bir vaka sınıfı örneği oluşturup doğrularsam satır numaralarım yansıtılır. oluşturulan vaka sınıfı, orijinal HOCON değil - yaklaşım yanlış anlamadığım sürece ... –

cevap

0

Kişiler paketler içe aktarmadan tehlikeli kod ekleyebilir; rm ... komutunu vermek için kaç tane kod satırı gerekiyor?

En iyi çözüm, kullanıcıların yapılandırma için kod göndermesine izin vermemek; Sadece bir XML ayrıştırıcısı veya benzeri kullanın. Sadece gerçekten güvenli olan alternatif, yüklemeyi kendiniz ayrıştırmak ve kullanmaları için izin verilen katı bir anahtar kelime listesi (ve alıntılanan dizeler) ile karşılaştırmak olacaktır. Bu noktada kendi yorumlayıcınızı yazmanın ve hala birçok hataya karşı savunmasız kalmanın bir yolunun yarısıdır, bu nedenle metin dosyalarını ayrıştırmak, temkinli seçenek ve güvenli olan gibi görünmeye başlar.

+0

Teşekkürler, Josiah. Twitter Eval'ı bırakıp Scala Parser Combinators'ı kullanarak özel bir DSL kullanmaya devam ettim. Sözdizimini geçtikten sonra XML'yi ayrıştırmaktan daha kolaydır. –

+0

@ToddFlanders lütfen soruyu kapatın –