当前位置:网站首页>2020-09-18 referer认证 url转义
2020-09-18 referer认证 url转义
2022-06-29 09:10:00 【qqq2018】
任务1:referer提取并落日志
分析
1.怎么取处referer
2.怎么写入司南
代码拆解
//参数中的HttpRequest类型在下边
bool BidRequestHandler::ProcessBidRequest(const shared_ptr<HttpRequest> request, shared_ptr<HttpResponse> response) {
……
BidHandlerFactory* factory = GetFactory(*request);//GetFactory工厂的意思就是实例化
……
shared_ptr<BidRequestHandler> handler = factory->NewHandler(*request);//把handler“操作员”理解为处理这个东西的处理器。这里就是bidrequest竞价请求的处理器
//上边参数中的HttpRequest类型
class HttpRequest : public HttpBaseMessage {
public:
const std::string& uri() const;
const std::string& refer() const;//refer()和uri()声明是一样的,参照着uri()的用法写refer()
……
有时候是没有refer的,可以从下边看出没有的时候refer()返回的是空字符串:
const std::string& HttpHeader::header(const std::string& name) const {
const static std::string empty_str("");
std::vector<std::pair<std::string, std::string> >::const_iterator iter;
for (iter = headers_.cbegin(); iter != headers_.cend(); ++iter){
if(iter->first.size()== name.size() &&
boost::iequals(name, iter->first)){
return iter->second;
}
}
return empty_str;
}
不必判断,空字符串也能落日志。
实现
1.提取referer
//上边看到refer()和uri()声明是一样的,参照着uri()的用法写refer()
//NETGO_LOG(debug) << "request uri is : " << request->uri();
2.写司南
//写司南日志有好几种封装,这个是写法是(键,值)
//SetCompassGuardAttr(“is_retarget”, “true”);
所以写日志任务就一句话:
SetCompassGuardAttr<string>("gateway_refer", request->refer());
扩展:日志实时分析平台的原理
司南工作原理
参考:日志实时分析平台
https://cloud.tencent.com/developer/article/1082326
Logstash->Elasticsearch->Kibana
Logstash:数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置;
Elasticsearch:分布式搜索和分析引擎,具有高可伸缩、高可靠和易管理等特点。近实时的存储、搜索和分析操作。通常被用作某些应用的基础搜索引擎,使其具有复杂的搜索功能;
Kibana:数据分析和可视化平台。通常与 Elasticsearch 配合使用,对其中数据进行搜索、分析和以统计图表的方式展示;
Filebeat:ELK 协议栈的新成员,一个轻量级开源日志文件数据搜集器,基于 Logstash-Forwarder 源代码开发,是对它的替代。
任务2:referer黑名单判断
(个数不多,个位数)
实现
黑名单格式设计
下边的方法会查找配置文件,我们在这个配置文件中放置referer的黑名单。
有一个问题是这个配置文件的键值对的值仅支持int,double和string这三种基本类型,所以没法将黑名单存为list或者set。计划用string来存储黑名单,用空格来进行分割(因为url中是没有空格的,会被转义为+号)
//这个方法会从一个配置文件中读取key对应的value,本例中key为“ad_traffic_type”,不存在的话默认值是0。可以用这个方法取出来黑名单
int ad_traffic_type =
NS_ADPOS::AdPosComponent<NS_ADPOS::AD_POS>::GetCntlPoint(
&pos_component_param_, "ad_traffic_type", 0);
判断referer是否命中黑名单中存的url们
// 判断header_referer这个url是不是在黑名单中。
bool IsRefererInBlacklist(const std::string& header_referer) {
std::string header_referer_black_list = "";
std::string curr_referer = "";
//header_referer_black_list = "opqrgo;andfop odjfaop goajgopahdoj a";
header_referer_black_list = NS_ADPOS::AdPosComponent<NS_ADPOS::AD_POS>::GetCntlPoint(&pos_traffic_info, "header_referer_black_list", header_referer_black_list);
while (header_referer_black_list.size()){
size_t pos = header_referer_black_list.find_first_of(" ");
if (pos == std::string::npos) {
if (header_referer_black_list == header_referer) {
return true;
}
return false;
}
else {
curr_referer = header_referer_black_list.substr(0, pos);
if (curr_referer == header_referer) {
return true;
}
}
header_referer_black_list = header_referer_black_list.substr(pos+1);
}
return false;
}
IsRefererInBlacklist(request->refer());
扩展:url特殊字符编码
网址URL中特殊字符转义编码
| 字符 | URL编码值 |
|---|---|
| 空格 | %20 |
| " | %22 |
| # | %23 |
| % | %25 |
| & | %26 |
| ( | %28 |
| ) | %29 |
| + | %2B |
| , | %2C |
| / | %2F |
| : | %3A |
| ; | %3B |
| < | %3C |
| = | %3D |
| > | %3E |
| ? | %3F |
| @ | %40 |
| \ | %5C |
| | | %7C |
有时候空格会被编码成+号,有时候编码成%20.
原因:W3C标准规定,当Content-Type为application/x-www-form-urlencoded时,URL中查询参数名和参数值中空格要用加号+替代,所以几乎所有使用该规范的浏览器在表单提交后,URL查询参数中空格都会被编成加号+。
而在另一份规范RFC2396,定义URI里, URI里的保留字符都需转义成%HH格式,因此空格会被编码成%20,加号+本身也作为保留字而被编成%2B。
对于某些遵循RFC 2396标准的应用来说,它可能不接受查询字符串中出现加号+,认为它是非法字符。所以一个安全的举措是URL中统一使用%20来编码空格字符。
其他一些含义:
1、空格换成加号(+)
2、正斜杠(/)分隔目录和子目录
3、问号(?)分隔URL和查询
4、百分号(%)制定特殊字符
5、#号指定书签
6、&号分隔参数
熟悉string的操作是很重要的喔~下班啦hhh!!
边栏推荐
- kdevelop新建工程
- Automatic Multi-Organ SegmVentation on Abdominal CT With Dense V-Networks
- LC236. 二叉树的最近公共祖先
- 滑块验证代码
- 367. 有效的完全平方数-二分法
- easyexecl导出100万行execl报字体错误的解决办法
- 股票炒股账号开户安全吗?是靠谱的吗?
- UE4 compile a single file (VS and editor start respectively)
- Zabbix4.4 configure the indicators of the monitoring server and solve the garbled graphics pages
- 《网络是怎么样连接的》读书笔记 - WEB服务端请求和响应(五)
猜你喜欢

MATLAB小技巧(21)矩阵分析--偏最小二乘回归

In the era of data processing, data quality construction is the way for enterprises to survive

A comparison of methods for fully automatic segmentation of tumors and involved nodes in PET/CT of h

UE4 blueprint modify get a copy in array to reference

Hystrix熔断器:服务熔断与服务降级

In the future of Business Intelligence BI, how do you view the ai+bi model?

Western Polytechnic University, one of the "seven national defense schools", was attacked by overseas networks

Gd32f4xx Ethernet chip (ENC28J60) driver migration

Five heart charity matchmaker team

Generic paging framework
随机推荐
es报错NoNodeAvailableException[None of the configured nodes are available:[.127.0.0.1}{127.0.0.1:9300]
微信小程序实现store功能
Self cultivation (XXI) servlet life cycle, service method source code analysis, thread safety issues
Have you done the network security "physical examination" this year?
官方stm32芯片包下载地址 stm32f10x stm32f40x下载
安装Anaconda后启动JupyterLab需要输入密码
Pytoch Summary - transform between sensor and numpy
c#判断数组是否包含另一个数组的任何项
kdevelop新建工程
The 23 most useful elasticsearch search techniques you must know
Implementation of multi key state machine based on STM32 standard library
# 《网络是怎么样连接的》读书笔记 - WEB服务端请求和响应(四)
Introduction to Chang'an chain data storage and construction of MySQL storage environment
数据仓库:金融/银行业的分层架构篇
Data warehouse: layered architecture of Finance / banking
Mysql5.7 installation tutorial in centos7 under Linux
In the future of Business Intelligence BI, how do you view the ai+bi model?
After aikuai is installed or reset, the PC or mobile terminal cannot obtain IP
Gross Tumor Volume Segmentation for Head and Neck Cancer Radiotherapy using Deep Dense Multi-modalit
CROSSFORMER: A VERSATILE VISION TRANSFORMER BASED ON CROSS-SCALE ATTENTION