1.修改原数据流动作定义,增加操作定义

2.重构原操作重定向、替换
3.新增接口http_block、http_hijack、http_insert
4.注册处理策略表接口policy_table_new_cb等
5.注册处理用户自定域json处理接口policy_param_new等
6.添加对添加对注入脚本的测试用例
This commit is contained in:
fengweihao
2019-05-21 19:15:37 +08:00
committed by zhengchao
parent 6ac97cce6b
commit 913313bd86
5 changed files with 1089 additions and 135 deletions

View File

@@ -7,6 +7,7 @@
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <assert.h>
@@ -30,7 +31,8 @@ enum replace_zone zone_name_to_id(const char * name)
}
return (enum replace_zone) i;
}
static char * strchr_esc(char * s, const char delim)
static char *__attribute__((__unused__))
strchr_esc(char * s, const char delim)
{
char * token;
if (s == NULL)
@@ -54,7 +56,8 @@ static char * strchr_esc(char * s, const char delim)
return token;
}
}
static char * strtok_r_esc(char * s, const char delim, char ** save_ptr)
static char *__attribute__((__unused__))
strtok_r_esc(char * s, const char delim, char ** save_ptr)
{
char * token;
@@ -75,8 +78,26 @@ static char * strtok_r_esc(char * s, const char delim, char ** save_ptr)
return s;
}
char *rt_read_file(const char* filename, size_t *input_sz)
{
FILE* fp=NULL;
struct stat file_info;
stat(filename, &file_info);
*input_sz=file_info.st_size;
size_t format_replace_rule(const char * exec_para, struct replace_rule * replace, size_t n_replace)
fp=fopen(filename,"r");
if(fp==NULL)
{
return NULL;
}
char* data=(char*)malloc((*input_sz));
fread(data,1,*input_sz,fp);
fclose(fp);
return data;
}
size_t __attribute__((__unused__))
format_replace_rule(const char * exec_para, struct replace_rule * replace, size_t n_replace)
{
char * tmp = ALLOC(char, strlen(exec_para) + 1);
char * token = NULL, * sub_token = NULL, * saveptr = NULL, * saveptr2 = NULL;
@@ -225,15 +246,81 @@ size_t execute_replace_rule(const char * in, size_t in_sz,
return 0;
}
}
size_t insert_string(char * in, size_t in_sz, const char *insert_on, const char *stype, const char *type, char** out)
{
char *target=NULL;
size_t outlen=0, target_size=0;
char position[]="</head>";
/* "<script type=\"text/javascript\" class=\"RQ_SCRIPT\"></script>"*/
int js_type_len = 58;
/*"<style type=\"text/css\" class=\"RQ_SCRIPT\"></style>"*/
int css_type_len = 49;
char* head_string=NULL;
if (0==strcasecmp(type, "css"))
{
target_size = in_sz+strlen(stype)+css_type_len;
target = ALLOC(char, target_size);
}
if (0==strcasecmp(type, "js"))
{
target_size = in_sz+strlen(stype)+js_type_len;
target = ALLOC(char, target_size);
}
if (insert_on != NULL && 0==strcasecmp(insert_on, "after-page-load"))
{
memcpy(position, "</body>", sizeof(position));
}
head_string=strstr(in, position);
if (head_string != NULL)
{
strncat(target, in, MIN((unsigned int)(head_string-in), target_size));
size_t style_len = 0; char *style_msg = NULL;
if (0==strcasecmp(type, "js"))
{
style_len = strlen(stype)+js_type_len+1;
style_msg = ALLOC(char, style_len);
snprintf(style_msg, style_len, "<script type=\"text/javascript\" class=\"RQ_SCRIPT\">%s</script>", stype);
}
if (0==strcasecmp(type, "css"))
{
style_len = strlen(stype)+css_type_len+1;
style_msg = ALLOC(char, style_len);
snprintf(style_msg, style_len, "<style type=\"text/css\" class=\"RQ_SCRIPT\">%s</style>\n", stype);
}
strncat(target, style_msg, target_size);
free(style_msg);
style_msg = NULL;
strncat(target, head_string, target_size);
*out = target;
outlen = strlen(target) + 1;
}else
{
free(target);
target = NULL;
outlen = 0;
}
return outlen;
}
size_t execute_insert_rule(char * in, size_t in_sz, const struct insert_rule * rules, char** out)
{
return insert_string(in, in_sz, rules->position, rules->stype, rules->type, out);
}
void simple_replace(const char* find, const char* replacement, const char* input, size_t in_sz, char** output, size_t *output_sz)
{
char* exec_para=NULL;
asprintf(&exec_para,"zone=http_resp_body;substitute=/%s/%s", find, replacement);
size_t n_got_rule=0;
size_t n_got_rule=1;
struct replace_rule rules[16];
n_got_rule=format_replace_rule(exec_para, rules, sizeof(rules)/sizeof(rules[0]));
rules[0].zone = kZoneResponseBody;
rules[0].find = tfe_strdup(find);
rules[0].replace_with = tfe_strdup(replacement);
*output_sz=execute_replace_rule(input, strlen(input), kZoneResponseBody, rules, n_got_rule, output);
free(exec_para);
return;
}