php-ast 开源,PHP AST学习 - osc_ryjlu6z2的个人空间 - OSCHINA - 中文开源技术交流社区...
前一陣和前同事交流在檢測webshell方面的相關(guān)方法,其中提出了使用lex yacc做一套語法解析來解析字節(jié)碼段來判斷是否存在webshell。
后來在查找相關(guān)資料中,找到了github開源的一個(gè)工具:PHP-Parser。能夠把php文件解析AST(抽象語法樹)
Project:?https://github.com/nikic/PHP-Parser
安裝:
php composer.phar require nikic/php-parser
例如:
{var_dump($foo);
}
CODE;$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);try{$ast = $parser->parse($code);
}catch (Error $error) {echo "Parse error: {$error->getMessage()}\n";return;
}$dumper = newNodeDumper;echo $dumper->dump($ast) . "\n";
轉(zhuǎn)儲(chǔ)AST為:
array(0:Stmt_Function(
byRef: falsename:Identifier(
name:test
)
params: array(0:Param(
type: nullbyRef: falsevariadic: false
var:Expr_Variable(
name:foo
)default: null)
)
returnType: nullstmts: array(0:Stmt_Expression(
expr:Expr_FuncCall(
name:Name(
parts: array(0: var_dump)
)
args: array(0:Arg(
value:Expr_Variable(
name:foo
)
byRef: false
unpack: false)
)
)
)
)
)
)
可以看到各個(gè)節(jié)點(diǎn)的含義,相比較查看opcode然后再去解析容易的多,opcode比較晦澀難懂。
如果做得好,再進(jìn)行回歸成原始的代碼,例如webshell中存在很多字符串拼接、函數(shù)拼接等操作。回歸最終原始代碼,再去檢測會(huì)變得容易的多。
關(guān)于php-parser的文檔也有很多:
https://github.com/nikic/PHP-Parser/tree/master/doc
我個(gè)人的目前思路:
1、獲取web目錄
2、對每個(gè)php文件生成AST
3、解析AST,進(jìn)行語法回歸,轉(zhuǎn)儲(chǔ)原始代碼 // 這個(gè)地方比較有難度
4、使用多引擎(正則、機(jī)器學(xué)習(xí)、第三方接口)進(jìn)行判斷文件是否異常。
總結(jié)
以上是生活随笔為你收集整理的php-ast 开源,PHP AST学习 - osc_ryjlu6z2的个人空间 - OSCHINA - 中文开源技术交流社区...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php7.0 java 性能,php7代
- 下一篇: xcode开发php,xcode怎么编写