Selenium如何定位到canvas以及如何单击canvas上的元素

最近在做一个自动化的上传项目,碰到了Selenium需要点击canvas上的元素关闭网页蒙层的问题? 想了好久一直没有解决,在网上搜索和实践,终于找到解决方法。

1.定位canvas

这个比较简单,有很多方法,比如 find_element_by_id()

2.点击canvas中的元素,关闭蒙层

这里需要用到 ActionChains 这个类,它是继承selenium.webdriver这个父类,

使用方法也比较简单,主要是操作鼠标,移动到那个关闭按钮的坐标上

ActionChains(driver).move_to_element_with_offset(canvas,590,190).click().perform()

这里做下简单的解释,driver是浏览器的实例,move_to_element_with_offset() 通过相对定位找到元素,canvas是这个canvas画布,click()是鼠标的单击操作,perform()是执行操作,590是元素到左边边框的距离,190是元素到顶部边框的距离。

这样一行命令就完美解决了问题,关闭了网页上的canvas蒙层!

给出参考链接: https://www.pythonf.cn/read/99311

如何持续监控仿冒域名

在当前激烈的数字化时代,品牌安全面临着来自网络的持续威胁。攻击者通过注册与正版域名高度相似的仿冒域名,实施网络钓鱼、品牌假冒等欺诈行为,不仅窃取用户数据,更严重损害企业声誉。传统的被动防御和人工排查已难以应对海量且快速变化的域名威胁。因此,构建一套自动化、持续性的仿冒域名监控系统,已成为企业安全建设的必备环节。而开源工具dnstwist,正是实现这一目标的利器。

dnstwist是一款功能强大的域名变体生成与检测引擎。它的核心能力在于,能够基于一个目标域名(如yourcompany.com),通过数十种算法自动生成数千个潜在的仿冒变体。这些算法涵盖了攻击者常用的手法,例如:利用视觉相似的Unicode字符进行同形异义字攻击、模拟用户输入错误的拼写错误抢注(如youcompany.com)、插入连字符、替换顶级域(TLD)等。生成变体后,dnstwist会自动查询DNS,验证这些域名是否已被注册,从而精准地识别出潜在的威胁。

要实现自动化监控,首先需要部署dnstwist。它可以通过Python的pip工具轻松安装

pip install dnstwist[full],也支持Docker容器化部署,便于集成到现有的安全运维体系中。基础的使用命令非常简单,例如,执行dnstwist –registered yourcompany.com,即可列出所有已被注册的、与yourcompany.com相似的域名。

然而,真正的价值在于将其转化为一个持续运行的监控任务。我们可以编写一个简单的Python脚本,利用schedule等定时任务库,让dnstwist每隔数小时自动执行一次扫描。脚本的核心逻辑是调用dnstwist的库函数,获取检测结果,并与上一次的扫描结果进行比对。一旦发现新增的已注册域名,便立即触发告警。

为了提升检测的精准度,可以启用dnstwist的高级功能。例如,使用–lsh参数进行模糊哈希检测,它会抓取可疑网站的HTML源码并与官方网站比对,计算相似度,有效识别出克隆网站。又如,通过–mxcheck参数检查可疑域名的邮件交换(MX)记录,可以判断攻击者是否意图拦截发往您公司的邮件。所有检测结果都可以导出为JSON或CSV格式,方便与SIEM(安全信息和事件管理)或SOAR(安全编排、自动化与响应)平台集成,实现从威胁发现到处置的自动化闭环。

通过dnstwist构建的这套自动化监控系统,企业能够将品牌保护从被动响应转变为主动狩猎。它如同一个不知疲倦的哨兵,7×24小时监控着互联网的每一个角落,一旦发现仿冒域名便立即告警,为安全团队争取到宝贵的响应时间,从而有效降低网络钓鱼和品牌劫持带来的风险,为企业的数字资产构筑起一道坚固的防线。

浅谈企业信息安全如何从0到1-(一)

企业信息安全体系,包括了技术和管理这两个方面。建设和完善这个体系是保障公司或企业所有信息系统能安全,稳定,正常运行和线上业务顺利开展的前提。

1.技术体系

技术体系可以分拆成二个能力,其中一个是建设跟安全相关的基础设施和系统的能力,另外一个是安全运营的能力。

第一个能力有哪些?比如防火墙的设计,WAF的建设,抗D的建设,CC的防护,红蓝对抗等,才能抵御来自网络边界的攻击。 当然这部分能力,作为企业来说,可以外采相关的安全设备,产品,服务,也可以自行研发相关的系统。

第二个能力对于企业来说也是相当重要的,因为当研发或者采购了安全设备和产品之后,需要部署和使用起来,才能真正保障,但是这个过程实操的难度是比较高的,涉及到相关的安全人员的技术能力和经验,攻防对抗程度,企业的发展阶段,以及企业IT基础设施的支撑能力等许多因素,比如如何nginx的访问日志都还没有接入到ELK中,怎么对日志进行研判,发现攻击行为呢?安全运营是技术体系落地的重要保障。

2.管理体系

管理体系也包含两个层面,一个是发布和维护信息安全相关的制度,规范,流程,策略

另外一个是落地能力。企业常常面临的问题是安全管理制度和流程无法落地。其中涉及高层的重视程度和外部监管,合规要求,部门之间的协作,企业IT基础设施的支撑能力,安全自动化等。

管理体系能否落地以及落地程度是衡量安全管理能力的标准。

我在宠物电商做企业安全建设之办公安全篇(1)

我当时进入到某宠物电商的时候,深刻的记得,当时公司为了降低代码被开发人员拷走的风险,给每个开发人员配置一个台式机用于在内网进行开发,然后配置一个笔记本用于在外网查询资料。

每个台式机的外部都套了一个大黑箱,只有一个小豁口用于台式机的插线的功能,然后需要移位开箱的时候,需要进行申请备案,才能操作。

现在看来这种方式虽在有点low,但是在当时的环境和条件下,已经算是在不易了,尽可能对代码外泄做了一定的物理防护,毕竟我进去之前,公司也没有专业的安全人员,能在一些基线上做点工作,实属不易,而且确实提高了内部人员做恶的成本。

当时我记得上外网用了一个海蜘蛛的网络设备,不是很稳定,经常断网,而且没有对上网行为进行管控,然后对外网的访问限制几乎是没有的,但是内网是无法直接访问到外网的,当然除了我们运维人员和几个领导的之外。总体上的原则是:准进不准出。

在很长的一段时间内,保护了数据的安全,直到后面我们搬移到了新的办公场所,重新对网络进行规划和设计,才引入了深信服的上网行为管理设备。

我在宠物电商做企业安全建设-业务风控篇(1)

进入到某电商宠物之后,我就开始接触各种羊毛党和黑产,原因是公司的运营人员对风控这档事儿好像漠不关心,前后被大大小小的搞了很多次,没有复盘,没有总结,结果还是好了伤疤忘了痛,压根没想过如何把实惠给到真实用户,而是只关心营销数据或者GMV这些指标去了,让人感觉不理解。

那么我是怎么关心起业务风控的呢? 我记得有一次,我在测试一个用户活动,好像是个签到的功能,我就简单地用脚本重复请求了一次,结果也成功,成功之后就会获取一种官方的虚拟抵扣币,暂且叫e币吧 ,而官方的使用规则就是,这个e币可以抵扣总商品价格的10%,简单来说 就是100元的商品,我可以用10个e币抵扣10元,只需要付款90元。这种获取e币的渠道多种多样,主要是鼓励用户多参加官网的活动,提升用户的活跃度,从出发点来看,是ok.

但是这里有个问题,就是这些参与活动的渠道是否都有被严格做过安全测试,我当时也是严重怀疑,然后就自己去灰盒测试了几个活动,果不其然,其中一部分活动存在被绕过或者可以重复参加的情况,可能很多人(包括开发人员+产品经理+测试人员 )都没有发现。

这些对于专业的羊毛党和黑产来说,是他们所愿意看到的。更严重的是,除了我之外,还没有人去追踪过这些e币的合理性,比如说到底有多少真实用户参与了某个活动,获得了多少个e币的奖励。

说实在的,看到这样的情况,也是很无语的,从实际价值来看,这些e币其实都是公司的营销成本,如果没有这些e币,那么用户就需要追加商品被抵扣的部分,对于公司来说,是资金的损失,但是一些人对待这些e币的态度,认为就是一些虚拟币,公司想发多少,就发多少,即使被薅羊毛了,也问题不大。

有这种看法的人不在少数,而且天真地以为这种情况对公司的危害不大。其实我当时也挺震惊的,因为跟钱相关,真金白银,我想对于公司损失不只是现金流,而重要是那些实实在在的优惠被羊毛党和黑产所窃取。

我在宠物电商做企业安全建设之运维安全篇(1)

我记得当时进入某宠物电商的时候,当时是以PHP开发工程师的角色,本来以为所做的工作也会是以PHP开发为主,不过命运使然,在多次跟当时技术总监“沟通交流”之后,我被赋予了更有挑战性的角色-运维安全,就这么顺理成章成为运维组的一员。

其实没有什么的私下沟通,而是当时我几乎每天都会在公司官方上找到了几个Bug,于是就整理成文档,通过邮件抄送给技术总监,而技术总监也希望有人把公司的安全的管理起来,所以一切看起来都是很自然而然。

进入公司的第一个挑战,就是很多PHP开发的开发环境都在本地使用的wamp或者phpstudy搭建的集成环境,每个开发配置的php.ini也不尽相同,导致跟线上测试环境,线上生产环境的差异比较大。所以领导希望运维组能想办法解决此事。

其实当时我们组内沟通了一下这个问题的解决方案,最后给出的方法是,在本地服务器上部署一套跟线上测试环境差不多的PHP环境,然后给每个PHP开发人员创建一个Web根目录,然后根据开发机的IP来进行区分,映射到不同的根目录里面去,这样开发人员在保存代码的同时,会通过ftp将代码上传到本地服务器,然后在本地完成host的绑定。

比如 程序员A(192.168.2.1) 将www.xx.com 的host绑定到 192.168.2.11 ,然后在本地浏览器访问www.xx.com的时候,会访问192.168.1.1这台主机,这台主机上的配置nginx的转发功能,根据192.168.2.1将请求转发到 /www/htdocs/a/www.xx.com/下。

程序员B(192.168.2.2) 将www.xx.com 的host也绑定到 192.168.2.11 ,然后在本地浏览器访问www.xx.com的时候,会访问192.168.1.1这台主机,这台主机上的配置nginx的转发功能,根据192.168.2.2将请求转发到 /www/htdocs/b/www.xx.com/下。

但是都是使用的同一套PHP环境,唯一的不足点,是会导致硬盘数据量会增加,不过从实际效果来看,达到了预期,有点瑕疵也是能接受的。

如何爬取百度好看短视频

这里跟大家分享一下我是如何爬取到百度好看短视频的,分为以下的几步了,首先是打开网站http://haokan.baidu.com,建议使用chrome

可以根据频道,然后选择其中一个用户,这里以“洋子说动物“为例,然后点击用户的头像,进入到该用户的主页。

打开F12,开发者工具,然后选择“网络”-> “Fetch/XHR”,拉动鼠标向下,

在页面上会看到有视频不断的补充进来,然后网络请求栏里面,也陆续增加一些记录,这些记录是ajax的异步请求,返回的内容就是新增加进来的视频,然后我们详细查看下响应内容,

可以清楚的看到返回的格式是json,一次返回数量是10个视频,然后具体的就是每个视频的详情字段:

cover表示视频封面

duration 表示视频时长

playcnt 表示播放次数

publish_time 表示发布时间

title 表示视频的标题

vid. 表示视频的id

大家注意到这里,没有视频的播放地址,所以我们还需要打开一个视频观看,来查看视频的播放地址,

同样的打开开发者工具,然后选择“网络”-> “媒体”,可以看到视频的地址

这个视频的地址有点长,然后可以通过截取的方式,提取出mp4的简洁地址。

整理下代码思路,需要2个循环,第1个 是获取这个用户的所有视频链接,提取出视频id,第2个是访问视频的播放页面,获取到视频的地址。

最后是将所有的相关视频数据存入到数据库中。

另外就是需要加一个定时任务,因为我们不知道原创作者是什么时候更新视频,所以只能通过定时来拉取,判断目前用户已发布的视频是否被我们爬取出,如果爬取过,就不爬取,如果有没爬取过的数据,就爬取一遍。就是同步原创者的更新量。

这个方案也可以通过crontab,也可以通过Python的apscheduler来实现,方法有很多,大家可以去研究一下。

       Python实例代码我已经打包好了,需要的伙伴,找我私聊,发网盘链接

       接下来我给大家讲解下,如何将爬取的视频全自动同步到视频号上的。

screen 一个后台运行的神器

之前在运维的工作中,一直都是用nohup来实现让一个进程在后台执行而不影响到终端的输出

一般的格式如下:

nohup python a.py >> a.log &

这样的结果是让python a.py这个进程放到后台执行,并将所有的输出(正确输出/异常输出)都能打到a.log 这个文件里面。

最近因为要做个无人直播的项目接触到screen,发现这个工具也能实现类似的功能。

1.安装screen

yum -y install screen

2.使用screen,先创建一个屏幕

screen -S hello #hello为屏幕的名字

3查看目前的打开的屏幕

screen -ls

4.将某个屏幕放入到后台执行

screen -d hello

5.再次查看屏幕列表

screen -ls

这时会发现 hello这个屏幕的状态 有attached->dattached,意思是转变成了后台挂起执行

6.新开个终端,进入到某个屏幕中

screen -r hello

7直接结束某个屏幕

screen -X -S hello quit

即可结束某个屏幕

Python项目中调试执行单文件的注意点

有时候 ,我们在一个python项目做单文件调试的时候,会发现想单独执行某个文件,但是直接执行的话,会导致module not found 问题,这些文件从系统的path路径找不到,程序的引入文件,所以在这个时候,需要用到sys这个库。

你需要让代码告诉编译器,我引入的自定义的库文件在哪里,所以 一般的解决方案:

import sys

sys.path.append(‘./pathfile’)

#pathfile代表程序需要引入文件的相对路径或者绝对路径,

这样编译器就知道除了path以外,还需要去哪里引入库文件。

碰到的linux的dns解析问题

之前接到一个需求,在某台Linux上,需要对测试环境的所有域名进行解析,考虑到如果使用/etc/hosts的话,每个域名都要手动去配置一条记录 比如

127.0.0.1 hello.test.com

貌似解决了,但是这里有个前提提条件是,所有域名 ,公司的域名有几千个,不可能手动一个一个的去加记录,那么怎么处理呢?

这个时候需要 /etc/resolv.conf出场,这个文件是linux本机的dnsserver,所有在这里配置一个dnsserver就可以了,比如

10.99.88.1

当主机访问 x.test.com ,会先去resolv.conf读取dnsserver,然后会逐一尝试,当使用到10.99.88.1 就相当于 x.test.com->10.99.88.1 ,10.99.88.1一般是nginx的代理机器,所以能将x.test.com代理到后端真实的server上,这样就可以解决所有域名解析的问题了。

前提是10.99.88.1需要能转发x.test.com的请求到后端。