托攻击检测SDlib库的学习-----WZW托攻击学习日记(二)
大家好,今天我研究了大师兄做的库,名字叫做SDlib,是专门针对托攻击检测的,使用的语言是python,有兴趣的同学可以参考。大师兄的库是放在github上的,大家可以多多star送给我敬佩的大师兄。链接如下:
https://github.com/Coder-Yu
下面讲一讲,SDlib中如何注入虚假信息的。
第一步,下载好SDlib的压缩包,解压出来。这一步不浪费时间解释了,百度一下就会。
图一
第二步,仔细阅读了SDlib中的Readme,里面对于这个库有着比较详细的解释,这里呢,如果只是想看如何注入虚假用户的,可以直接跳到如图所示的地方。
图二
从中可知,如果不想了解原理,只需要改变conf文件中的变量就行,这里呢,我肯定是要讲讲更细节的东西,如果只想注入虚假用户的话,那就直接运行generateData.py就行了。
好,接下来,进入正题。了解代码含义。
首先,运行generateData.py观察运行结果。
部分截图为:
图三
我们会发现,系统正常运行了。并且出现了多次注入,即出现了多次loadingtraining data。现在寻找原因。
来到generateData.py,观察到generateData.py中的代码很少
图四
发现调用了HybridAttack,打开HybridAttack.py,发现HybridAttack的基类为Attack。所以转到attack.py文件,哇,很多代码,理解一下:
Init():是为了初始化各个变量的值。
图五
getAverageRating():获取平均评分,即现在真实用户对于该商品的评分的总值除以真实用户的评分数量。
selectTarget():顾名思义就是选择目标用户,怎么选的,看看代码
首先给item的键排个序,然后进入循环,循环的第一步是随机取一个数赋给target变量,如果这个target满足一下四个条件:选到的target对应的itemprofile小于maxcount,大于mincount,循环中之前并没有选到这个target,平均值小于threshold。
(为什么需要满足这四个条件,其实我也不清楚,再想想)
最后打印出来选择出的目标用户。
getFillerItems():获取装填项目
图六
这里也看了我一段时间,解释一下,首先获得装填项目的大小赋给mu,sigma不多说了,
然后利用获取符合正太分布的随机数的方法获取装填项目的数量,然后随机获取装填项目转为list形式。
(这里最难理解的是,为什么要有取正太分布这样的动作,难以理解。)
InsertSpam(): 这个就是看我们选择的是什么攻击了,我们拿平均攻击来举例,攻击的其他方式可以看我的托攻击检测学习日记(一),从学习日记(一)我们可以知道平均攻击其实就是往装填项目里面添加平均评分。(这里是看的评分攻击,明天再看关系攻击了。)
图七
(马上产生了一个疑问,startid这个变量有什么用?)
这里可以看出,startUserID就是代表着user评分的数量,然后进入for循环,循环次数为评分数量*攻击范围的大小。
然后就是对装填项目注入平均评分
还有就是对目标用户注入我们想要给的评分
loadTarget():获取数据集
generateLabels():给虚假用户和真实用户打上标记,真实为0,虚假为1
generateProfiles():将虚假的和真实的都写入profiles
图八
看到这里,其实我们还是没有解决一个问题,那就是为什么会出现这么多次选择目标用户?再探究一波?
啊,其实这个时候是我笨了,发现调用的是
于是打开HybridAttack.py
图九
发现他调用了三个攻击。为了检验一下,将HybridAttack改为AverageAttack。运行一下,果然,最后的结果只出现了一次。
图十
总结下来,今天遇到的问题还有三个没解决,一旦解决,我会在评论里面回复。
1. 为什么需要满足这四个条件?(selecttarget)
2. 为什么要使用正态分布取随机数?(getFillerItems)
3. StartID有什么意义呢?(insertSpam)
除了这三个问题,我们其实还没有去看关于关系注入的攻击和混合注入的攻击,没关系,饭一口一口吃,代码一行一行看,我们之后再看!