私はGroovyの静的解析を作成しようとしています。私の上司のためのPOCとして、私はちょうど簡単なコードを解析し、最も簡単な種類のSQLインジェクションを検出しようとしています。私は主な言語であるPythonでうまくやったが、私の会社は主にGrailsを使っている。ASTツリーをトラバースする方法
これは私がこれまで持っているものです。
import org.codehaus.groovy.ast.expr.*;
import org.codehaus.groovy.ast.stmt.*;
import org.codehaus.groovy.ast.*
import org.codehaus.groovy.control.CompilePhase
import org.codehaus.groovy.ast.CodeVisitorSupport
import org.codehaus.groovy.ast.builder.AstBuilder
public class SecurityCheck extends CodeVisitorSupport {
void visitBlockStatement(BlockStatement statement) {
println "NEW BLOCK STATEMENT:"
println statement.getText();
//keep walking...
statement.getStatements().each { ASTNode child ->
println "CHILD FOUND: "
println child.getText();
child.visit(this)
}
}
}
def code = new File('groovy_source.groovy').text // get the code from the source file
def AstBuilder astBuilder = new AstBuilder() // build an instance of the ast builder
def ast = astBuilder.buildFromString(CompilePhase.CONVERSION, code) // build from string when the compiler converts from tokens to AST
def SecurityCheck securityCheck = new SecurityCheck() // create an instance of our security check class
println ast
println ast[0]
ast[0].visit(securityCheck)
groovy_source.groovyファイルは、スポットの脆弱性への超簡単で、最小限のファイルを含む、非常に簡単です:
def post(id) {
query = "SELECT * FROM table WHERE id = " + id;
result = sql.execute query
return result;
}
ことがありますCodeVisitorSupportを継承しているので、これはBlockStatementにアクセスし、そのステートメント内の各ステートメントに対して、それはsupperクラスのメソッドを使用してアクセスします。
しかし、私はBlockStatementからテキストを印刷すると、それは空の文字列であり、各メソッドに対しても決して呼び出されません(ASTはブロックステートメントの子が見つからないことを意味するはずです。決定的にそれ内のステートメントを持っている。
[[email protected][]] // println ast
[email protected][] // println ast[0]
NEW BLOCK STATEMENT:
{ } // println statement.getText()
ここで任意の助けが飛躍的に高く評価されるだろう。ありがとう!
私はあなたを感じます。私がそのツリーをたどる方法を学ぶ方法は、リフレクション、.classファイルの分解、そしてスタックを分析するためのデバッガの使用など、多くの実験でした。私が探していた限り(2年前のようなことだったことを覚えておいてください)、オンラインドキュメントはありません。あなたが方法を探しているのであれば、自分でAPIを試してみてください。 –
うわー、それは落胆しているようです。どのようにしてやったかの実例がありますか?あるいは、少なくともCodeVisitorSupportクラスのソースコードがどこにあるのか知っていますか? – joaquinlpereyra
https://github.com/apache/groovy/tree/master/src/mainこれは始めるのに適していますが、http://grepcode.com/には多くの情報源があり、それがより便利です。 –