当前位置:网站首页>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!!
边栏推荐
- Introduction to Chang'an chain data storage and construction of MySQL storage environment
- LC236. 二叉树的最近公共祖先
- A comparison of methods for fully automatic segmentation of tumors and involved nodes in PET/CT of h
- 数据治理:数据治理在数据中台下的解决方案
- How to set Google Chrome as the default browser
- 基于stm32标准库独立按键的多按键状态机的实现
- Deep Learning-based Automated Delineation of Head and Neck Malignant Lesions from PET Images
- UE4 material UV texture does not stretch with model scale
- SPI drive of lsm6dsl
- 证券账号开户安全吗?是靠谱的吗?
猜你喜欢

Reading notes on how to connect the network - Web server request and response (IV)

The former security director of Uber faced fraud allegations and concealed the data leakage event

数据可视化:数据可视化四象限,教你正确应用图标

CROSSFORMER: A VERSATILE VISION TRANSFORMER BASED ON CROSS-SCALE ATTENTION

Application of decorator mode, packaging ServletRequest and adding addparameter method

Install and configure redis in the Linux environment, and set the boot auto start

Automatic Multi-Organ SegmVentation on Abdominal CT With Dense V-Networks

Simplicity Studio无法识别新买的JLink v9解决方法

阿里云服务器安装配置redis,无法远程访问

Gross Tumor Volume Segmentation for Head and Neck Cancer Radiotherapy using Deep Dense Multi-modalit
随机推荐
Simplicity studio does not recognize the new JLINK V9 solution
ORA-01950 对表空间无权限
The principle of session and cookie
監控數據源連接池使用情况
Matlab tips (21) matrix analysis -- partial least squares regression
Construction and use of Changan chain go language smart contract environment
Implementation of multi key state machine based on STM32 standard library
数据治理:数据标准管理(第三篇)
云管理平台:9大开源云管理平台(CMP)
商业智能BI的未来,如何看待AI+BI这种模式?
es报错NoNodeAvailableException[None of the configured nodes are available:[.127.0.0.1}{127.0.0.1:9300]
MATLAB小技巧(21)矩阵分析--偏最小二乘回归
Reading notes on how to connect the network - Web server request and response (IV)
Fabrication d'une calculatrice d'addition simple basée sur pyqt5 et Qt Designer
Is it safe to open an account for stock speculation? Is it reliable?
监控数据源连接池使用情况
CROSSFORMER: A VERSATILE VISION TRANSFORMER BASED ON CROSS-SCALE ATTENTION
基于keil5自动配置stm32f103标准库的官网freertos移植
Pytorch Summary - sensor on GPU
IDEA调试失败,报JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_LOAD(196)