Groovy の GString の概念は非常に強力です ( http://groovy.codehaus.org/Strings+and+GStringを参照)。
GStrings を使用すると、次のようなことができます。
world = "World"
println "Hello ${world}"
# Output: Hello World
println "1+2 = ${1+2}"
# Output: 1+2 = 3
println "${System.exit(-1)}"
# Program terminated
Groovy GString:s を使用すると、SQL インジェクション攻撃と同様にコードにセキュリティの問題が発生する可能性があるかどうかを把握しようとしています。
上記の例では、コードはプログラムの作成者によって記述されているため、System.exit(-1) コマンドの実行は、作成者の表明された意図であるため、セキュリティ上の欠陥と見なすことはできません。
ユーザー入力がフォーム フィールド (POST/GET パラメータの読み取り) とデータベース テーブル (GORM を使用) から取得される Grails Web アプリを作成しているとします。攻撃者が POST/GET リクエストとしてサーバーに送信される内容とデータベース内の内容の両方を制御すると仮定しましょう。
私のアプリのコードは次のようになります。
def str1 = params.someParameterControlledByTheAttacker
def str2 = SomeGORMPersistedObject.get(1).somePropertyFieldControlledByTheAttacker
render "Hello! Here is some text: ${str1} and ${str2}"
上記のシナリオで攻撃者がコードを実行できる方法はありますか? なんで?なぜだめですか?私の最初の仮説は、GString の使用は常に安全であるというものです。私が間違っていることを証明してください。できるだけ具体的にお願いします。
更新 #1:この質問はクライアント側ではなくサーバー側でのコード実行に関するものであるため、議論の焦点を維持するために、コード内の HTML-XSS の問題は無視してください。
更新 #2:一部の人々は、「不要な文字列を除外することは一般的に良い考え」であると指摘しています。「潜在的に悪い文字」を除外することで、確かにいくつかのクラスのセキュリティ問題を回避できるかもしれませんが、フィルタリングをしなくても安全なコードを書くほうがよいでしょう。Java JDBC API での PreparedStatements の使用法と比較できます。PreparedStatements を正しく使用すると、特定のクラスのインジェクション攻撃から保護されることが保証されます。SQL入力をフィルタリングしてもおそらく同じ結果が得られますが、PreparedStatementsを使用すると、IMHOのフィルタリングアプローチが厳密に支配されます。