2

あるオブジェクトが別のオブジェクトに「乗る」ための適格性を判断する必要がある状況があります。車両のルールは非常に紛らわしいので、プロジェクトを再起動または再コンパイルせずに変更できるようにしたいと考えています。

これは機能しますが、基本的に、セキュリティの友人を痙攣させて異言を話させます。

class SweetRider{
  String stuff
  BigDecimal someNumber
  BigDecimal anotherNumber
}

class SweetVehicle{
  static hasMany=[constraintLinkers:VehicleConstraintLinker]
  String vehicleName
  Boolean canIRideIt(SweetRider checkRider){
    def checkList = VehicleConstraintLinker.findAllByVehicle(this)
    checkList.each{
      def theClosureObject = it.closureConstraint
      def iThinkINeedAShell = new GroovyShell()
      def checkerThing = iThinkINeedAShell.evaluate(theClosureObject.closureText)
      def result = checkerThing(checkRider)
      return result
    }
  }
}

class VehicleConstraintLinker{
  static belongsTo = [closureConstraint:ConstraintByClosure, vehicle:SweetVehicle]
}

class ConstraintByClosure{
  String humanReadable
  String closureText
  static hasMany = [vehicleLinkers:VehicleConstraintLinker]
}

したがって、「stuff」が「peggy」または「waffles」であり、someNumber が anotherNumber より大きい場合にのみ、特定の車両の資格があるというルールを追加したい場合、私がしなければならないことは次のとおりです。

humanReadable = "peggy waffle some#>" で新しい ConstraintByClosure を作成し (人間が読める説明です)、この文字列を ClosureText として追加します。

{
   checkRider->if(
     ["peggy","waffles"].contains(checkRider.stuff) &&
     checkRider.someNumber > checkRider.anotherNumber ) {
     return true  
   } 
   else { 
      return false
   }
}

次に、VehicleConstraintLinker を作成してリンクすると出来上がりです。

私の質問はこれです: GroovyShell ができることを制限する方法はありますか? ファイル、グローバル、またはデータベース データを変更できないようにすることはできますか? これで十分ですか?

4

1 に答える 1

2

java.ioアクセスを拒否するjava.lang.Runtimeだけでは不十分であることに注意してください。悪意のあるコーダーが悪用しようとする可能性のある権限を持つ多くのコア ライブラリがあるため、信頼されていないスクリプトがアクセスできるシンボルをホワイトリストに登録するか (サンドボックスまたは機能ベースのセキュリティ)、JVM 内のすべてのものを制限する必要があります。 (Java SecurityManager 経由)。そうしないと、混乱した代理攻撃に対して脆弱になります。

スクリプトを実行するためのセキュリティ サンドボックスを提供しGroovyClassLoaderます。

Java / Groovy / Freemarker Code のサンドボックス化 - 特定のメソッドの実行を防ぐには、Groovyをサンドボックス化する方法について説明しますが、特にevaluate境界ではありません。

Groovy Scripts and JVM Securityでは、groovy スクリプトのサンドボックス化について説明しています。セキュリティマネージャをインストールするとJVMの他の多くのものに影響を与える可能性があるため、私はJVMセキュリティポリシーの大ファンではありませんが、ファイルやランタイムへのアクセスを傍受する方法を提供します.

最初の 2 つのスキームのいずれかが広範な攻撃にさらされているかどうかはわかりません。そのため、徹底的な攻撃レビューなしにそれらを展開することには慎重です。JVM セキュリティ マネージャは、ブラウザで広範囲にわたる攻撃を受け、多くの障害を被りました。それは優れた多層防御になる可能性があるため、貴重なものの唯一の防御線としてこれに依存することはありません.

于 2011-07-22T00:31:39.707 に答える