作者:hacker 日期:2023-03-15 分类:黑客网站
MongoTemplate配置
一般情况下,按照如下配置,springboot会进行自动装配,但是如果需要实现一些自定义的功能,例如密码加解密,类型转换等功能需要手写配置MongoTemplate。
@EnableMongoRepositories()表示支持Spring JPA,即通过规范命名的接口来实现简单的DB操作,不需要自己写Query,可以通过该注解的value属性来指定注解的作用范围。
ReUtil是一个正则表达式的工具类,用于判断配置文件的格式是否正确,配置MongoDatabaseFactory过程中实现一个比较简单的配置文件解密的过程,解密方法用简单的字符串翻转来实现。
通过MappingMongoConverter来实现java中的对象与MongoDB中的Document进行一些复杂的映射,默认情况下一个java域对象存入MongoDB时会生成一个"_class"的key对应存储Java对象类型,通过
来取消每条记录生成一个"-class"的数据。
通过MappingMongoConverter实现一个简单的时间转化功能TimestampConverter,如下所示
还可以进行更加精细化的配置,例如
可以通过WritingConverter和ReadingConverter配置Document和Java对象相互转化。
MongoTemplate实战
例如一个博客系统,我们通过MongoDB存储用户的浏览记录,浏览记录的实体如下所示,
如上所示,每个人对应每篇文章有一条浏览记录,每次访问都会对访问次数viewCount进行+1操作.下文针对这个场景介绍MongoTemplate的基本操作。
这些操作用法基本一样,如下所示,传入一个封装查询条件的对象Query,Java中映射的对象entityClass和MongoDB中对应的Document的名称。
例如我们想要查询某个用户某篇博客的访问次数,我们只需要通过博客id和访问者构建查询条件进行查询即可。
findAndModify表示更新符合查询条件的记录,其方法如下所示,
Query封装查询条件,Update封装的是更新内容。例如用户每次刷新页面浏览次数会+1操作,我们可以使用findAndModify操作,如下所示
如上所示,首先判断用户是否存在访问记录,如果存在则通过Update对访问次数viewCount进行+1操作,若不存在访问记录则新建访问记录。
保存操作包括主要包括insert和save方法,这两个方法都没有返回值,同时两个方法有一些区别,
该方法如下所示,
注释说明该方法的功能是,如果存在与查询条件匹配的文档,则根据Update中的内容进行更新,如果不存在符合查询条件的内容,则根据查询条件和Update插入新的文档。
聚合查询 MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。本文侧重于Java实现。
结合上述中的访问记录的场景,如果我们需要统计某个博主某个专栏下面所有文章的访问记录,包括访问总人数,访问总次数,以及每个访客对应的访问次数详情,并且要满足分页需求,那么我们需要用到MongoDB的聚合操作,具体实现如下所示
总结
本文详细介绍了SpringBoot如何整合MongoDB,并且结合博客系统的访问记录展示了MongoTemplate的基本用法。
一、node运行环境
1、npm install -g n
通过npm 全局安装node
2、 sudo n 8.16.0
设置node版本
Password:
install : node-v8.16.0
mkdir : /usr/local/n/versions/node/8.16.0
fetch :
######################################################################## 100.0%
installed : v8.16.0
3、node -v
v8.16.0
二、安装mongodb
1、brew tap mongodb/brew
2、brew install mongodb-community
= Installing mongodb-community from mongodb/brew
== Downloading
######################################################################## 100.0%
== Caveats
To have launchd start mongodb/brew/mongodb-community now and restart at login:
brew services start mongodb/brew/mongodb-community
Or, if you don't want/need a background service you can just run:
mongod --config /usr/local/etc/mongod.conf
== Summary
🍺 /usr/local/Cellar/mongodb-community/4.2.5: 21 files, 305.9MB, built in 7 minutes 4 seconds
(base) mengfaniaodeMBP:homebrew-core mengfanxiao$ cat usr/local/etc/mongod.conf
cat: usr/local/etc/mongod.conf: No such file or directory
(base) mengfaniaodeMBP:homebrew-core mengfanxiao$ brew services start mongodb/brew/mongodb-community
== Successfully started `mongodb-community` (label: homebrew.mxcl.mongodb-community)
3、启动/停止
brew services start mongodb-community
brew services stop mongodb-community
4、配置
配置文件:/usr/local/etc/mongod.conf
日志目录路径:/usr/local/var/log/mongodb
数据目录路径:/usr/local/var/mongodb
5、端口
三、问题梳理
1、环境问题
node -v
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.64.dylib
Referenced from: /usr/local/bin/node
Reason: image not found
Abort trap: 6
说明node相关库已被损坏 需要重新安装
卸载node
brew uninstall --ignore-dependencies node icu4c
Uninstalling /usr/local/Cellar/node/13.5.0... (4,663 files, 59.1MB)
node 12.12.0 is still installed.
Run `brew uninstall --force node` to remove all versions.
安装node
brew install node
通过这种方式安装的是最新版本的node 但很容易出现版本不兼容问题 所以不推荐这么安装 建议安装node8 该版本比较稳定 很少出现与其他软件不兼容情况
2、文件创建权限问题
== Installing dependencies for node: icu4c
== Installing node dependency: icu4c
== Downloading
######################################################################## 100.0%
== Pouring icu4c-64.2.mojave.bottle.tar.gz
Error: Failed to create /usr/local/opt/icu4c
Things that depend on icu4c will probably not build.
Could not symlink .
/usr/local/opt is not writable.
== Caveats
a、创建文件夹
sudo mkdir /usr/local/opt
b、root用户赋予当前用户操作该文件夹权限
此时该文件夹权限属于root 给mengfanxiao账户赋予权限
chown -R mengfanxiao /usr/local/opt
3、插曲 springboot启动问题
dea启动spring-boot,报java.lang.NoClassDefFoundError: javax/servlet/ServletContext错误
dependency
groupIdorg.springframework.boot/groupId
artifactIdspring-boot-starter-tomcat/artifactId
scopeprovided/scope
/dependency
把scope注释掉即可
maven中三种classpath
编译,测试,运行
1.compile: 默认范围 ,编译测试运行都有效
2.provided:在编译和测试时有效
3.runtime:在测试和运行时有效
4.test:只在测试时有效
5.system:在编译和测试时有效,与本机系统关联,可移植性差
4、环境不匹配问题
Node Sass does not yet support your current environment: OS X 64-bit with Unsupported runtime (79)qi
卸载重装(最新版本的node-sass)即可:
npm uninstall node-sass -D
npm install node-sass -D
5、版本冲突问题 node和mongodb版本不兼容
mongodb-core@1.2.31 requires a peer of kerberos@~0.0
node -v v13.12.0
npm -v 6.14.4
gyp ERR! command "/usr/local/Cellar/node/13.12.0/bin/node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild" gyp ERR! cwd /Users/mengfanxiao/Documents/project/company/wechain/questionnaire/node_modules/leveldown
gyp ERR! node -v v13.12.0
gyp ERR! node-gyp -v v5.1.0
gyp ERR! not ok
npm WARN mongodb-core@1.2.31 requires a peer of kerberos@~0.0 but none is installed. You must install peer dependencies yourself.
这种情况需要安装node8
brew search node
== Formulae
libbitcoin-node node node-sass node@12 nodebrew nodenv
llnode node-build node@10 node_exporter ✔ nodeenv
如果有node8
则 brew install node@8
然后brew link --overwrite --force node@8
没有node8
npm install -g n
sudo n 8.16.0
安装了node8版本
npm install
leveldown@1.7.2 install /Users/mengfanxiao/Documents/project/company/wechain/new/questionnaire/node_modules/level/node_modules/leveldown
prebuild-install || node-gyp rebuild
added 42 packages from 44 contributors in 20.79s
6、安装mongodb问题
brew install mongodb
Error: No available formula with the name 'mongodb'
MongoDB不再是开源的了,并且已经从Homebrew中移除 #43770
安装MongoDB社区服务器的最新可用生产版本(包括所有命令行工具)。这将安装MongoDB 4.2.x:
$ brew install mongodb-community
安装MongoDB社区服务器和命令行工具的最新4.2.x生产版本:
$ brew install mongodb-community@4.2
安装MongoDB社区服务器和命令行工具的最新4.0.x生产版本:
$ brew install mongodb-community@4.0
安装MongoDB社区服务器和命令行工具的最新3.6.x生产版本:
$ brew install mongodb-community@3.6
仅安装最新的mongoshell以连接到远程MongoDB实例:
$ brew install mongodb-community-shell
什么是渗透测试mongodb渗透工具?
渗透测试,是渗透测试工程师完全模拟黑客可能使用的攻击技术和漏洞发现技术,对目标网络、主机、应用的安全作深入的探测,发现系统最脆弱的环节。
如何进行Web渗透测试?
完整web渗透测试框架当需要测试的web应用数以千计,就有必要建立一套完整的安全测试框架,流程的最高目标是要保证交付给客户的安全测试服务质量。
1、立项mongodb渗透工具:项目建立,时间安排,人力分配,目标制定,厂商接口人确定;
系统分析威胁分析:针对具体的web应用,分析系统架构、使用的组件、对外提供的接口等,以STRIDE为威胁模型进行对应的安全威胁分析,输出安全威胁分析表,重点关注top3威胁;
制定测试用例:根据威胁分析的结果制定对应的测试用例,测试用例按照模板输出,具备可执行性;
测试执行漏洞挖掘:测试用例执行发散测试,挖掘对应的安全问题or漏洞;
问题修复回归测试:指导客户应用开发方修复安全问题or漏洞,并进行回归测试,确保安全问题or漏洞得到修复,并且没有引入新的安全问题;
项目总结评审:项目过程总结,输出文档评审,相关文档归档。
2、Web应用的渗透测试流程
主要分为3个阶段,分别是:信息收集→漏洞发现→漏洞利用,下面仔细分析一下各个阶段流程:
一、信息收集
在信息收集阶段,我们需要尽量多的收集关于目标web应用的各种信息,比如:脚本语言的类型、服务器的类型、目录的结构、使用的开源软件、数据库类型、所有链接页面,用到的框架等
脚本语言的类型:常见的脚本语言的类型包括:php、asp、aspx、jsp等
测试方法:
1 爬取网站所有链接,查看后缀
2 直接访问一个不存在页面后面加不同的后缀测试
3 查看robots.txt,查看后缀
服务器的类型:常见的web服务器包括:apache、tomcat、IIS、ngnix等
测试方法:
1 查看header,判断服务器类型
2 根据报错信息判断
3 根据默认页面判断
目录的结构:了解更多的目录,可能发现更多的弱点,如:目录浏览、代码泄漏等。
测试方法
1 使用字典枚举目录
2 使用爬虫爬取整个网站,或者使用google等搜索引擎获取
3 查看robots.txt是否泄漏
使用的开源软件:我们如果知道了目标使用的开源软件,我们可以查找相关的软件的漏洞直接对网站进行测试。
测试方法
指纹识别(网络上有很多开源的指纹识别工具)
数据库类型:对于不同的数据库有不同的测试方法。
测试方法
1 使应用程序报错,查看报错信息
2 扫描服务器的数据库端口(没做NAT且防火墙不过滤时有效)
所有链接页面:这个跟前面的获取目录结构类似,但是这个不只是获取网站的所有功能页面,有时候还可以获取到管理员备份的源码。
测试方法
1 使用字典枚举页面
2 使用爬虫爬取整个网站,或者使用google等搜索引擎获取
3 查看robots.txt是否泄漏
用到的框架:很多网站都利用开源的框架来快速开发网站,所以收集网站的框架信息也是非常关键的。
测试方法
指纹识别(网络上有很多开源的指纹识别工具)
二、漏洞发现
在这个阶段我们在做测试的时候要对症下药,不能盲目的去扫描,首先要确定目标应用是否使用的是公开的开源软件,开源框架等、然后在做深一度的漏洞扫描。
关于开源软件的漏洞发现
开源的软件:常见的开源软件有wordpress、phpbb、dedecms等
开源的框架:常见的开源框架有Struts2、 Spring MVC、ThinkPHP等
中间件服务器:常见的中间件服务器有jboss、tomcat、Weblogic等
数据库服务:常见的数据库服务mssql、mysql、oracle、redis、sybase、MongoDB、DB2等
对于开源软件的测试方法
1 通过指纹识别软件判断开源软件的版本信息,针对不同的版本信息去开放的漏洞数据库查找相应版本的漏洞进行测试
2 对于默认的后台登录页、数据库服务端口认证等入口可以进行简单的暴力破解、默认口令尝试等操作
3 使用开源的漏洞发现工具对其进行漏洞扫描,如:WPScan
关于自主开发的应用
手动测试:这个阶段,我们需要手工测试所有与用户交互的功能,比如:留言、登入、下单、退出、退货、付款等操作
软件扫描:使用免费的软件扫描,如:appscan、wvs、netsparker,burp等
可能存在的漏洞
Owasp关键点
代码安全之上传文件
代码安全之文件包含
代码安全之SSRF
逻辑漏洞之密码重置
逻辑漏洞之支付漏洞
逻辑漏洞之越权访问
平台安全之中间件安全
三、漏洞利用
针对不同的弱点有不同的漏洞利用方式,需要的知识点也比较多。一般这个阶段包括两种方式,一种是手工测试,一种是工具测试
手工测试
手工测试是通过客户端或服务器访问目标服务,手工向目标程序发送特殊的数据,包括有效的和无效的输入,观察目标的状态、对各种输入的反应,根据结果来发现问题的漏洞检测技术。手工测试不需要额外的辅助工具,可由测试者独立完成,实现起来比较简单。但这种方法高度依赖于测试者,需要测试者对目标比较了解。手工测试可用于Web应用程序、浏览器及其mongodb渗透工具他需要用户交互的程序。
这种方式对于有特殊过滤等操作,或者网络上没有成型的利用工具的时候可以使用。
工具测试
网络上有很多好用的免费利用工具,比如针对sql注入的sqlmap、针对软件漏洞的matesploit等。
对数据进行聚合操作mongodb渗透工具,然后将计算之后的数据返回。聚合操作将多个文档的值组合在依赖,并且可以对分组数据执行各种操作返回单个结果。
MongoDB提供三种方式来执行聚合操作:aggregation pipeline、map-reduce function、single purpose aggregation methods。
MongoDB 聚合操作是在数据处理管道的逻辑上建模的。documents可以进入一个用于处理docuemnt然后返回聚合值的多阶段管道。
底层的管道提供mongodb渗透工具了filters(类似于查询的操作)和document transformations(修改document的输出形式)操作。
其他管道操作为document指定具体的属性或者多个属性进行分组和排序,以及用array内容的聚合工具一样。管道的阶段可以使用运算符执行任务。
管道使用MongoDB自带的本地操作来执行聚合操作更高效,管道是MongoDB执行聚合操作的首先。
聚合管道可以操作分片collection。聚合管道可以通过使用索引来提高性能。聚合管道内部会进行优化阶段。
可以使用db.collection.aggregate()的explain参数看到执行计划。
聚合管道来决定需要返回的字段。如果使用只需要的字段,这样可以减少数据量。
addFields + match放入到 addFields之前(如果是 project / $addFields的结果,就不能移动),减少数据量。
match: 先执行$match来减少数据量,然后在执行排序操作。
match: 如果在前面添加$match操作,可以使用索引来减少数据操作。
skip(在3.2开始可以使用):将 project操作之前,可以减少数据量。
通常情况下,在重新排序优化之后才会发生阶段合并。
limit:如果不能减少数据量,不会将这两个阶段合并。否则先进行排序,然后获取指定的数量,放入内存。如果在中间含有$skip操作,将其放入最后。
在数据量超过内存限制,这个操作需要设置 allowDiskUse=true。
从MongoDB3.6开始,删除了aggregate的选项,将结果作为一条数据的返回。
aggregate可以返回cursor或者数据结果集。在返回的结果中,每个document的大小不能超过16M(这个限制只针对返回的document)。
documents有可能会超过这个限制,db.collection.aggregate()默认返回cursor。
从MongoDB2.6开始,管道阶段的RAM限制为100M。如果超过限制,出错。如果为了处理大量的数据集,使用allowDiskUse选项开启管道阶段的聚合操作将数据写入到临时文件。
从MongoDB3.4之后, graphLookup操作会忽略这个选项。如果其他阶段有aggregate()操作,allowDiskUse=true将会影响这些阶段。
从MongoDB3.2开始,如果按照分片来匹配值,只会在这个分片内进行计算。
聚合操作在多个分片上执行操作,如果没有指定主分片,这些操作会被路由到其他分片上,来减少主分片的负载。
lookup阶段需要在主分片上执行查询。
将聚合管道拆分为两部分,这是为了在分片上执行优化。
操作可以 参考实例
MapReduce可以在分片上执行操作,分片集合可以作为输入或者输出。
使用分片集合作为MapReduce输入源,mongos将作业并行派发到各个分片。mongos会等待所有的作业完成。
如果MapReduce的out字段有分片值,MongoDB使用_id字段作为分片的依据。
作为一个分片集合输出:
在操作的过程中,mapreduce有很多锁:
相关 练习教程
Mongo是一个高性能,开源,无模式的文档型数据库,它在许多场景下可用于替代传统的关系型数据库或键/值存储方式。Mongo使用C++开发,提供了以下功能:
◆面向集合的存储:适合存储对象及JSON形式的数据。
◆动态查询:Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
◆完整的索引支持:包括文档内嵌对象及数组。Mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。
◆查询监视:Mongo包含一个监视工具用于分析数据库操作的性能。
◆复制及自动故障转移:Mongo数据库支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目标是提供冗余及自动故障转移。
◆高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)。
◆自动分片以支持云级别的伸缩性(处于早期alpha阶段):自动分片功能支持水平的数据库集群,可动态添加额外的机器。
MongoDB的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统(丰富的功能)架起一座桥梁,集两者的优势于一身。根据官方网站的描述,Mongo适合用于以下场景:
◆网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
◆缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源过载。
◆大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
◆高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对MapReduce引擎的内置支持。
◆用于对象及JSON数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储及查询。
自然,MongoDB的使用也会有一些限制,例如它不适合:
◆高度事务性的系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。
◆传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。
◆需要SQL的问题
MongoDB支持OS X、Linux及Windows等操作系统,并提供了Python,PHP,Ruby,Java及C++语言的驱动程序,社区中也提供了对Erlang及.NET等平台的驱动程序。
首先到下面mongodb渗透工具的工具原料中的mongodb的官网下载对应mongodb渗透工具你系统的安装包,拷贝到你的linux系统上面,如果有网络可以直接用wget下载
解压对应的安装包
命令如下:
tar zxf mongodb-linux-i686-2.0.2.tgz
因为mongodb不需要像别的数据库那样繁琐的配置解压后放到惯例的/usr/local目录下面,当然你可以放到任何地方,放到/usr/local下面方便管理
命令如下:
mv mongodb-linux-i686-2.0.2/* /usr/local/mongodb
然后为mongodb创建数据库存放的位置和日志文件,默认是在/data/db下面,同样为了方便就在mongodb下面建立了相应的目录
进到mongodb下面的bin目录下查看mongodb的帮助文档和mongodb渗透工具我们用到的启动参数
启动mongodb数据库,对应的参数说明用绿色表明了
为了安全期间建议关闭28017端口防止信息外泄
做好上面的操作就可以进入mongodb的客户端开始你的mongodb之旅了.
步骤阅读
已有4位网友发表了看法:
访客 评论于 [2023-03-16 00:43:34] 回复
dFields之前(如果是 project / $addFields的结果,就不能移动),减少数据量。 match: 先执行$match来减少数据量,然后在执行排序操作。 match: 如果在前面添加$match操作,可以使用索引来减少数据操
访客 评论于 [2023-03-16 05:08:51] 回复
0.2/* /usr/local/mongodb然后为mongodb创建数据库存放的位置和日志文件,默认是在/data/db下面,同样为了方便就在mongodb下面建立了相应的目录进到mongodb下面的bi
访客 评论于 [2023-03-15 20:33:19] 回复
把scope注释掉即可 maven中三种classpath 编译,测试,运行 1.compile: 默认范围 ,编译测试运行都有效 2.provided:在编译和测试时有效 3.runtime:在测试和运行时有效 4.tes
访客 评论于 [2023-03-16 03:25:29] 回复
络上有很多开源的指纹识别工具)二、漏洞发现在这个阶段我们在做测试的时候要对症下药,不能盲目的去扫描,首先要确定目标应用是否使用的是公开的开源软件,开源框架等、然后在做深一度的漏洞扫描。关于开源软件的漏洞发现开源的软件:常见的开源软件有wordpress、ph