内容简介:来篇正式点的Post吧我觉得CNN算法就其本身而言,应用与NLP是没有问题的。但是这个检测率应该可以再提升一点。
来篇正式点的Post吧
前言
我觉得CNN算法就其本身而言,应用与NLP是没有问题的。
但是这个检测率应该可以再提升一点。
因为SQL,XSS的注入方法,就语法上而言,比NLP要简单一些。
还可以用C写一个检测程序。
这样就更容易让这个模型跑在实际的环境。
而且,样本在送检之前,首先做了循环解码,再做归一化处理。
循环解码是需要的,但是归一化处理不一样。
安全性不论,每条数据先要跑正则再送检,这个效率要比传统的正则匹配法低一些。
那么,让我在巨人的肩膀上,再做一些小改进。
理论
对于通过CNN来做NLP处理的论文,国内外都可以找到很多。
大致的原理是这样:
句子->词向量->卷积层->池化层->链接层
简单的说,就是把句子内的词转化为词向量,后面接单层的CNN。
训练数据
首先,我们需要训练集,对照集,检测集 这个可以用github的一些数据。这里,就使用前一文中提到的数据集来检测。
首先,循环读取每一条数据,对每条数据循环解码,打上标签,最后存档。
这里的UrlDecode()完成循环解码的功能。
for each_line in sql_file: str=UrlDecode(each_line) f.writelines('sql' + '\t' + str + '\n') count += 1 print("sql end at %d" % count)
对于训练集的第一条数据
1%29%20AND%205628%3D4794
经过改写后,变成这样
sql 1)and5628=4794
全部改写完成后,就可以用之前提到的模型训练了
整个训练在6次迭代后完成。 这个是tensorboard的损失图像。
最后使用test集,可以达到99%以上的检测率。
混淆矩阵也很好看。
检测
之前说过,我们需要让这个模型能应用于实际的生产中。
那么,结合Tensorflow的C库,来写一个检测程序。
关于Tensorflow C库的使用,有很多现有的例子,就不多写了。
大致的流程是这样
int main(int argc, char* argv[]) { if (argc < 2) return 1; // pre load tf_model_t* model = LoadTFModel("./tf_model.pb"); FillTensor(argv[1]); printf("Model Returns: %d\n", RunTFModel(model)); FreeTFModel(model); return 0; }
这样,就完成了使用C来检测注入的目标。
如果是需要重复的使用,可以在系统启动时调用LoadTFModel(),检测时只需调用FillTensor()和RunTFModel()即可。
可以省略掉加载的时间。
不用时调用FreeTFModel()清空资源。
如果需要看下单次处理的速度之类。
在FillTensor()和RunTFModel()之间加个循环,前后记录时间,转double除一下就可以。
我在i7-2700上跑了50万次,平均不到100微秒。
大致1秒1万-2万多次的样子。
有时间调调参,或者使用GPU的话应该会更高。
结语
撸猫撸猫
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。