4

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のフィルタリングアプローチが厳密に支配されます。

4

5 に答える 5

3

いいえ、 GString の形成は「コンパイル時」の現象であるため、GString メカニズムによって新たに問題が発生することはありません。それらの値は実行時に決定 (および変更) される可能性がありますが、フォームはそうではありません。

別の見方をすると、GStrings でできることはすべて、まったく同じセマンティクスで、クロージャーと文字列の連結で行うことができます。GString は単なるシンタックス シュガーです。クロージャー (または、文字列の連結が禁止されていること) について心配している場合を除き、GString について心配する必要はありません。

于 2009-04-07T05:17:35.317 に答える
0

与えられたコードサンプルでは、​​セキュリティの問題はありません。str1とstr2は、単にtoStringメソッドが呼び出されるだけであり、GStringsのデフォルトのtoStringメソッドにセキュリティホールはありません。

プログラムの作成者であるあなたが「somePropertyFieldControlledByTheAttacker」のゲッターを定義して、値の内容を実際に評価しない限り、安全です。

セキュリティホールが発生する唯一の方法は、プログラムの作成者がセキュリティホールを追加した場合です。

于 2009-03-22T20:27:15.597 に答える
0

上記のコードにはクロスサイトスクリプティングの脆弱性がある可能性があります。必ず.encodeAsHTML()を呼び出すようにしてください。そうしないと、悪者がyaを台無しにする可能性があります。

于 2009-04-01T02:11:41.623 に答える