2020-09-18 referer认证 url转义

任务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!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值