昨天和前端同事调试,拿到一个形式如下的http uri:
放到浏览器上一敲,在服务端日志里看到的是:
服务端调用
const char* uri = evhttp_request_get_uri(req);
char* decoded_uri = evhttp_decode_uri(uri);
进行decode之后可以变回原来的uri:
接下来调用 struct evhttp_uri* parsed_uri = evhttp_uri_parse(decoded_uri); 进行uri解析分段。
在uri的business_data里包含了uri的保留字符 [] : 。调用evhttp_uri_parse的时候无法正常解析uri,返回NULL。在下一步的evhttp_uri_get_query的时候传入空指针发生了coredump。
可见libevent的evhttp_uri_get_query方法并不是安全的方法,未做参数检查。
总结:
在调用libevent包含指针形参的方法前,需要对要传入的参数做条件判断;
uri中存在json数据时候需要做转义或者base64的编码;
参考链接: