2016-11-04 6 views
1

私は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() 

ここで任意の助けが飛躍的に高く評価されるだろう。ありがとう!

+0

私はあなたを感じます。私がそのツリーをたどる方法を学ぶ方法は、リフレクション、.classファイルの分解、そしてスタックを分析するためのデバッガの使用など、多くの実験でした。私が探していた限り(2年前のようなことだったことを覚えておいてください)、オンラインドキュメントはありません。あなたが方法を探しているのであれば、自分でAPIを試してみてください。 –

+0

うわー、それは落胆しているようです。どのようにしてやったかの実例がありますか?あるいは、少なくともCodeVisitorSupportクラスのソースコードがどこにあるのか知っていますか? – joaquinlpereyra

+0

https://github.com/apache/groovy/tree/master/src/mainこれは始めるのに適していますが、http://grepcode.com/には多くの情報源があり、それがより便利です。 –

答えて

0

を私は答えを見つけた。私は最終的にはそれほど難しいことではありませんでしたが、恐ろしいドキュメントはなりません。ツリーをトラバースする場合は、次のように、2番目の引数としてfalse booleanをコンストラクタに渡す必要があります。

def ast = astBuilder.buildFromString(CompilePhase.CONVERSION, false, code) 

次に、visit *メソッドを期待どおりに使用できます。

関連する問題