php代码静态检测,PHP静态分析与跨站脚本检测

最近在看PHP静态分析与跨站脚本检测的东西,用的是维也纳大学一个博士生做出来的Pixy,这个东西是开源的,而且也作了好几年了,功能逐渐增强。现在这个3.0.3版本里边有225个程序,Checker是主程序,现在所有结果都是显示在命令行的,如果被检测程序大,结果很多,当然是个问题。而我要做的大概是将其显示到GUI中去,并且改进它本身呈鼓里边一些不足的地方。

从寒假就开始看他的程序,寒假里边没有怎么搞明白,又冷,手生冻疮了。回来以后,从头开始看吧,分析那一部分不是很明白,但是看到后来,检测漏洞的时候,我想暂时不管它存储的结构什么,反正都是Node之类的东西,看他是怎么检测的,有的细节地方那个暂时翻过去,结果感觉比前边analysze部分简单得多了,连那些存储结构什么的都明白些了。

当然也看他的论文,论文换了一个寒假看完,没弄明白,像Cfg这些东西在论文中有,但是显示不出来,没有直观的感觉,不爽。所以这两天忙着弄了个GUI界面来显示这个Cfg控制流图,麻烦了一点,不过总算是出来了,看看好像也没有多大问题,献丑在这里了。另外,本来是自己使用的,有的地方考虑不周也无所谓,自己再调调就行了。

共有3个文件,第一个是Coor.java,保存每个节点的坐标以及其子节点坐标:

packageat.ac.tuwien.infosys.www.pixy;importjava.util.*;publicclassCoor...{privateintx;privateinty;privateListcoors;publicCoor(intx,inty)...{this.coors=newLinkedList();this.x=x;this.y=y;

}publicintgetX()...{returnthis.x;

}publicintgetY()...{returnthis.y;

}publicListgetCoors()...{returnthis.coors;

}publicvoidaddCoor(Coor coor)...{this.coors.add(coor);

}publicbooleanequals(Coor coor)...{if(coor.getX()==this.x&&coor.getY()==y)...{returntrue;

}returnfalse;

}publicbooleancontains(Coor c)...{for(Coor coor :this.coors)...{if(coor.getX()==c.getX()&&coor.getY()==c.getY())...{returntrue;

}}returnfalse;

}}

第二个是DrawPanel.java,负责画图的组件:

packageat.ac.tuwien.infosys.www.pixy;importat.ac.tuwien.infosys.www.pixy.conversion.Cfg;importat.ac.tuwien.infosys.www.pixy.conversion.nodes.*;importjava.util.*;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;/** *//***

*@authorAdministrator*/publicclassDrawPanelextendsJPanel...{privatejava.util.ListcfgList;privatejava.util.ListcoorList;/** *//**Creates a new instance of OvalJPanel*/publicDrawPanel(java.util.ListcfgList, java.util.ListcoorList)...{this.cfgList=cfgList;this.coorList=coorList;

}//在面板上绘制图形publicvoidpaintComponent(Graphics g)...{for(inti=0;i

CfgNode cfgNode=this.cfgList.get(i);

Coor coor=this.coorList.get(i);intx=coor.getX();inty=coor.getY();

g.setColor(Color.red);

g.drawOval(x-50, y-15,100,30);

g.setColor(Color.blue);

g.drawString(cfgNode.toString(), x-30, y-5);

g.drawString("Loc :"+String.valueOf(cfgNode.getOrigLineno()), x, y+10);

java.util.Listcoors=coor.getCoors();for(Coor c : coors)...{intcx=c.getX();intcy=c.getY();

g.setColor(Color.black);if(c.equals(coor))...{

g.setColor(Color.yellow);

}g.drawLine(x, y+15, cx, cy-15);

}}}}

第三个是Draw.java,主控制组件,只需要在Checker中调用该类,传以适当参数(Cfg),就可以了。

packageat.ac.tuwien.infosys.www.pixy;importat.ac.tuwien.infosys.www.pixy.conversion.Cfg;importat.ac.tuwien.infosys.www.pixy.conversion.nodes.*;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjava.util.*;/** *//***

*@authorAdministrator*/publicclassDraw...{//声明框架privateJFrame frame=newJFrame("Control Flow Graph");//声明书签面板privateDrawPanel draw;privateCfg cfg;privateMapmap;privatejava.util.ListcfgList;privatejava.util.ListcoorList;privateintstartX=50;privateintstartY=30;/** *//**Creates a new instance of TabbedJFrame*/publicDraw(Cfg cfg)...{//this.map = new TreeMap();this.cfgList=newLinkedList();this.coorList=newLinkedList();this.cfg=cfg;

}publicvoidshow()...{

frame.add(newJScrollPane(newDrawPanel(this.cfgList,this.coorList)), BorderLayout.CENTER);

frame.setSize(1000,1000);

frame.setLocation(50,50);

frame.setVisible(true);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}/** *//*** 将Cfg转换为cfgList和coorList.*/publicvoidconvert()...{

CfgNode node=this.cfg.getHead();intsize=this.cfg.size();

Coor coor=newCoor(startX, startY);this.cfgList.add(node);this.coorList.add(coor);

System.out.println(size);

java.util.Listnoded=newLinkedList();for(inti=0;i

n=-1;for(CfgNode cfgNode :this.cfgList )...{

n++;if(noded.contains(cfgNode))...{continue;

}node=cfgNode;break;

}}noded.add(node);//为了上边的if判断好做,故在此向noded中添加java.util.Listlist=node.getSuccessors();intlen=list.size();if(len==0)...{continue;

}intk=0;

coor=this.coorList.get(this.cfgList.indexOf(node));

startY=coor.getY()+60;for(CfgNode cfgNode : list)...{

startX=coor.getX()+k*250;

k++;if(this.cfgList.contains(cfgNode))...{

Coor c=(Coor)this.coorList.get(this.cfgList.indexOf(cfgNode));if(!coor.contains(c))...{

coor.addCoor(c);

}continue;

}coor.addCoor(newCoor(startX, startY));this.cfgList.add(cfgNode);this.coorList.add(newCoor(startX, startY));

}node=list.get(0);//这里取到的CfgNode可能已经分析过了,通过上边的if判断可以从cfgList中另外取一个。}}publicvoidsetStartX(intx)...{this.startX=x;

}publicvoidsetStartY(inty)...{this.startY=y;

}publicintgetStartX()...{returnthis.startX;

}publicintgetStartY()...{returnthis.startY;

}publicvoiddump()...{

System.out.println("------------------");for(inti=0; i

CfgNode cfgNode=this.cfgList.get(i);

Coor coor=this.coorList.get(i);

System.out.println(cfgNode.toString()+""/**//*+ cfgNode.toString()*/+""+coor.getX()+""+coor.getY()+""+coor.getCoors().size());

}System.out.println("------------------");

}publicvoiddumpMap()...{

java.util.Listlist=this.cfg.dfPreOrder();

System.out.println("******************");for(CfgNode node : list)...{

System.out.println(""+node.toString()+""+node.getSuccessors().size());

}System.out.println("******************");

}publicstaticvoidmain(String [] args)...{//new Draw();}}

可能这个项目还会做很久,中间会不会有些心得继续放到这个懒得管的空间中来呢,期待着。

相关文章

相关视频

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值