php-ast 开源,PHP AST学习 - osc_ryjlu6z2的个人空间 - OSCHINA - 中文开源技术交流社区...
前一阵和前同事交流在检测webshell方面的相关方法,其中提出了使用lex yacc做一套语法解析来解析字节码段来判断是否存在webshell。
后来在查找相关资料中,找到了github开源的一个工具: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";
转储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)
)
)
)
)
)
)
可以看到各个节点的含义,相比较查看opcode然后再去解析容易的多,opcode比较晦涩难懂。
如果做得好,再进行回归成原始的代码,例如webshell中存在很多字符串拼接、函数拼接等操作。回归最终原始代码,再去检测会变得容易的多。
关于php-parser的文档也有很多:
https://github.com/nikic/PHP-Parser/tree/master/doc
我个人的目前思路:
1、获取web目录
2、对每个php文件生成AST
3、解析AST,进行语法回归,转储原始代码 // 这个地方比较有难度
4、使用多引擎(正则、机器学习、第三方接口)进行判断文件是否异常。
php-ast 开源,PHP AST学习 - osc_ryjlu6z2的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐
- 文档上传下载 php开源,PHP文件的上传下载 - PHP开发学习门户的个人空间 - OSCHINA - 中文开源技术交流社区...
(1).在标签中将enctype和method两个属性指明相应的值. Enctype="multipart/form-data"; Method="POST" ...
- 平面设计python教程_什么是平面设计? - Python学习教程的个人空间 - OSCHINA - 中文开源技术交流社区...
平面设计是什么? 任何一个做平面设计的人,或多或少的会想到这一个问题,在此我不想用过多的语言去解释这个问题,.有一个同行的前辈曾经用一个比较形象的话打了个比方,所谓设计,就是纸本来是包不住火的,但是 ...
- java 最小众倍数_c学习 - osc_p1q9onsn的个人空间 - OSCHINA - 中文开源技术交流社区...
** 初学C+交流 ** 某次培新题(仅供参考) 1.一般交换机会处于哪一层?( B ) A.物理层 B.数据链路层 C.网络层 D.传输层 2.表示关系上的a>=b>=c的C语言表达式的 ...
- python语言是由谁设计并领导开发的_python语言概述 - osc_lt3ocv4d的个人空间 - OSCHINA - 中文开源技术交流社区...
python语言的发展 python语言诞生于1990年,由Guide van Rossum设计并领导开发. python语言是开源项目的优秀代表,其解释器的全部代码都是开源的. 编写Hello程序 ...
- 每天学习java一小时_java再学感受 - 编程一小时的个人空间 - OSCHINA - 中文开源技术交流社区...
首先的是,我买了一本新的有关于java的书,刚开始看,其实在此之前我已经学了一本java语法的书本,现在我买的这本书是我用来提升自己的java认知水平的,首先是对这本书的第一印象吧,里面的内容比较详细 ...
- osc mysql_MySQL学习(一) - osc_0sz5p35w的个人空间 - OSCHINA - 中文开源技术交流社区...
一.MySQL介绍 Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系 ...
- php新建数据表输入自己相信,php学习记录 - whoAmIR的个人空间 - OSCHINA - 中文开源技术交流社区...
留言板的结构相对比较简单,主要分为以下几个文件: 我建立的mysql表 `bbs`, 里面分别有 user,用于记录 用户id `id` int(10) auto_increment, 用户名`use ...
- java成果_java学习成果1 - chenxiao60的个人空间 - OSCHINA - 中文开源技术交流社区
//我的第一个java程序 /**the first thinking in java example program * display a string and today's date * @a ...
- java笔记冯佳微盘,JAVA学习笔记14 - osc_vsdge2u3的个人空间 - OSCHINA - 中文开源技术交流社区...
01(Map集合概述和特点) * A:Map接口概述 * 查看API可以知道: * 将键映射到值的对象 * 一个映射不能包含重复的键 * 每个键最多只能映射到一个值 * B:Map接口和Collect ...
最新文章
- 【 MATLAB 】画出一个复指数序列的幅度、相位、实部和虚部的MATLAB脚本
- .net 文件服务器系统,File-service基于ASP.NET Core的可伸缩、通用的文件服务器
- Unable to load script from assets ‘index.android.bundle‘.
- jQuery formValidator表单验证插件4.1.0 下载 演示 文档 可换肤 代码生成器
- mysql 两行的差异_MySQL两行之间的日期差异
- 【iCore1S 双核心板_ARM】例程五:IWDG看门狗实验——复位ARM
- 返回表对象的方法之一--bulk collect into
- CSS 3 颜色属性
- Puzzle UVA - 227 谜题
- 二维码在Access中的使用
- 前端使用prettier格式化规范
- android 自定义特效,Android 自定义控件~流光特效
- 关于深度学习云服务器推荐
- 微信公众平台测试号登录入口地址
- 【专栏】RPC系列(实战)-负重前行的“动态代理”
- 【搜索】B055_LQ_梅花桩(bfs / 贪心)
- C语言-函数指针void(*)(void),通用函数指针void(*)()
- Android启动摄像机拍照存储展示
- ucenter php版本,PHP优秀系统UCenter的MVC架构
- 高效的敏捷测试第十课 BDD实践和深化