mirror of
https://github.com/owasp-modsecurity/ModSecurity.git
synced 2025-08-14 05:45:59 +03:00
Merge 2.5.x changes into trunk.
This commit is contained in:
parent
48981bb7c8
commit
9d26b16e23
7
CHANGES
7
CHANGES
@ -1,6 +1,13 @@
|
|||||||
22 Apr 2009 - trunk
|
22 Apr 2009 - trunk
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
|
* Populate GEO:COUNTRY_NAME and GEO:COUNTRY_CONTINENT as documented.
|
||||||
|
|
||||||
|
* Handle a newer geo database more gracefully, avoiding a potential crash for
|
||||||
|
new countries that ModSecurity is not yet aware.
|
||||||
|
|
||||||
|
* Allow checking &GEO "@eq 0" for a failed @geoLookup.
|
||||||
|
|
||||||
* Fixed mlogc global mutex locking issue and added more debugging output.
|
* Fixed mlogc global mutex locking issue and added more debugging output.
|
||||||
|
|
||||||
* Cleaned up build dependencies and configure options.
|
* Cleaned up build dependencies and configure options.
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
/* -- Lookup Tables -- */
|
/* -- Lookup Tables -- */
|
||||||
|
|
||||||
static const char *geo_country_code[] = {
|
static const char *geo_country_code[GEO_COUNTRY_LAST + 1] = {
|
||||||
"--",
|
"--",
|
||||||
"AP","EU","AD","AE","AF","AG","AI","AL","AM","AN",
|
"AP","EU","AD","AE","AF","AG","AI","AL","AM","AN",
|
||||||
"AO","AQ","AR","AS","AT","AU","AW","AZ","BA","BB",
|
"AO","AQ","AR","AS","AT","AU","AW","AZ","BA","BB",
|
||||||
@ -50,7 +50,7 @@ static const char *geo_country_code[] = {
|
|||||||
"ZM","ME","ZW","A1","A2","O1","AX","GG","IM","JE"
|
"ZM","ME","ZW","A1","A2","O1","AX","GG","IM","JE"
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *geo_country_code3[] = {
|
static const char *geo_country_code3[GEO_COUNTRY_LAST + 1] = {
|
||||||
"--",
|
"--",
|
||||||
"AP","EU","AND","ARE","AFG","ATG","AIA","ALB","ARM","ANT",
|
"AP","EU","AND","ARE","AFG","ATG","AIA","ALB","ARM","ANT",
|
||||||
"AGO","AQ","ARG","ASM","AUT","AUS","ABW","AZE","BIH","BRB",
|
"AGO","AQ","ARG","ASM","AUT","AUS","ABW","AZE","BIH","BRB",
|
||||||
@ -79,7 +79,7 @@ static const char *geo_country_code3[] = {
|
|||||||
"ZMB","MNE","ZWE","A1","A2","O1","ALA","GGY","IMN","JEY"
|
"ZMB","MNE","ZWE","A1","A2","O1","ALA","GGY","IMN","JEY"
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *geo_country_name[] = {
|
static const char *geo_country_name[GEO_COUNTRY_LAST + 1] = {
|
||||||
"N/A",
|
"N/A",
|
||||||
"Asia/Pacific Region","Europe","Andorra","United Arab Emirates","Afghanistan","Antigua and Barbuda","Anguilla","Albania","Armenia","Netherlands Antilles",
|
"Asia/Pacific Region","Europe","Andorra","United Arab Emirates","Afghanistan","Antigua and Barbuda","Anguilla","Albania","Armenia","Netherlands Antilles",
|
||||||
"Angola","Antarctica","Argentina","American Samoa","Austria","Australia","Aruba","Azerbaijan","Bosnia and Herzegovina","Barbados",
|
"Angola","Antarctica","Argentina","American Samoa","Austria","Australia","Aruba","Azerbaijan","Bosnia and Herzegovina","Barbados",
|
||||||
@ -108,7 +108,7 @@ static const char *geo_country_name[] = {
|
|||||||
"Zambia","Montenegro","Zimbabwe","Anonymous Proxy","Satellite Provider","Other","Aland Islands","Guernsey","Isle of Man","Jersey"
|
"Zambia","Montenegro","Zimbabwe","Anonymous Proxy","Satellite Provider","Other","Aland Islands","Guernsey","Isle of Man","Jersey"
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *geo_country_continent[] = {
|
static const char *geo_country_continent[GEO_COUNTRY_LAST + 1] = {
|
||||||
"--",
|
"--",
|
||||||
"AS","EU","EU","AS","AS","SA","SA","EU","AS","SA",
|
"AS","EU","EU","AS","AS","SA","SA","EU","AS","SA",
|
||||||
"AF","AN","SA","OC","EU","OC","SA","AS","EU","SA",
|
"AF","AN","SA","OC","EU","OC","SA","AS","EU","SA",
|
||||||
@ -315,11 +315,13 @@ int geo_lookup(modsec_rec *msr, geo_rec *georec, const char *target, char **erro
|
|||||||
/* NOTE: This only works with ipv4 */
|
/* NOTE: This only works with ipv4 */
|
||||||
if ((rc = apr_sockaddr_info_get(&addr, target, APR_INET, 0, 0, msr->mp)) != APR_SUCCESS) {
|
if ((rc = apr_sockaddr_info_get(&addr, target, APR_INET, 0, 0, msr->mp)) != APR_SUCCESS) {
|
||||||
|
|
||||||
*error_msg = apr_psprintf(msr->mp, "Geo lookup of \"%s\" failed: %s", log_escape(msr->mp, target), apr_strerror(rc, errstr, 1024));
|
*error_msg = apr_psprintf(msr->mp, "Geo lookup for \"%s\" failed: %s", log_escape(msr->mp, target), apr_strerror(rc, errstr, 1024));
|
||||||
|
msr_log(msr, 4, "%s", *error_msg);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if ((rc = apr_sockaddr_ip_get(&targetip, addr)) != APR_SUCCESS) {
|
if ((rc = apr_sockaddr_ip_get(&targetip, addr)) != APR_SUCCESS) {
|
||||||
*error_msg = apr_psprintf(msr->mp, "Geo lookup of \"%s\" failed: %s", log_escape(msr->mp, target), apr_strerror(rc, errstr, 1024));
|
*error_msg = apr_psprintf(msr->mp, "Geo lookup for \"%s\" failed: %s", log_escape(msr->mp, target), apr_strerror(rc, errstr, 1024));
|
||||||
|
msr_log(msr, 4, "%s", *error_msg);
|
||||||
return 0;
|
return 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -360,8 +362,9 @@ int geo_lookup(modsec_rec *msr, geo_rec *georec, const char *target, char **erro
|
|||||||
if (geo->dbtype == GEO_COUNTRY_DATABASE) {
|
if (geo->dbtype == GEO_COUNTRY_DATABASE) {
|
||||||
country = rec_val;
|
country = rec_val;
|
||||||
country -= geo->ctry_offset;
|
country -= geo->ctry_offset;
|
||||||
if (country <= 0) {
|
if ((country <= 0) || (country > GEO_COUNTRY_LAST)) {
|
||||||
*error_msg = apr_psprintf(msr->mp, "No geo data for \"%s\".", log_escape(msr->mp, target));
|
*error_msg = apr_psprintf(msr->mp, "No geo data for \"%s\" (country %d).", log_escape(msr->mp, target), country);
|
||||||
|
msr_log(msr, 4, "%s", *error_msg);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -383,8 +386,9 @@ int geo_lookup(modsec_rec *msr, geo_rec *georec, const char *target, char **erro
|
|||||||
rc = apr_file_read_full(geo->db, &cbuf, sizeof(cbuf), &nbytes);
|
rc = apr_file_read_full(geo->db, &cbuf, sizeof(cbuf), &nbytes);
|
||||||
|
|
||||||
country = cbuf[0];
|
country = cbuf[0];
|
||||||
if (country <= 0) {
|
if ((country <= 0) || (country > GEO_COUNTRY_LAST)) {
|
||||||
*error_msg = apr_psprintf(msr->mp, "No geo data for \"%s\".", log_escape(msr->mp, target));
|
*error_msg = apr_psprintf(msr->mp, "No geo data for \"%s\" (country %d).", log_escape(msr->mp, target), country);
|
||||||
|
msr_log(msr, 4, "%s", *error_msg);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (msr->txcfg->debuglog_level >= 9) {
|
if (msr->txcfg->debuglog_level >= 9) {
|
||||||
@ -472,7 +476,7 @@ int geo_lookup(modsec_rec *msr, geo_rec *georec, const char *target, char **erro
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
*error_msg = apr_psprintf(msr->mp, "Geo lookup of \"%s\" succeeded.", log_escape(msr->mp, target));
|
*error_msg = apr_psprintf(msr->mp, "Geo lookup for \"%s\" succeeded.", log_escape(msr->mp, target));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,6 +29,8 @@
|
|||||||
#define GEO_COUNTRY_DATABASE 1
|
#define GEO_COUNTRY_DATABASE 1
|
||||||
#define GEO_CITY_DATABASE_0 6
|
#define GEO_CITY_DATABASE_0 6
|
||||||
#define GEO_CITY_DATABASE_1 2
|
#define GEO_CITY_DATABASE_1 2
|
||||||
|
#define GEO_COUNTRY_LAST 250
|
||||||
|
|
||||||
|
|
||||||
typedef struct geo_rec geo_rec;
|
typedef struct geo_rec geo_rec;
|
||||||
typedef struct geo_db geo_db;
|
typedef struct geo_db geo_db;
|
||||||
|
@ -1206,11 +1206,16 @@ static int msre_op_geoLookup_execute(modsec_rec *msr, msre_rule *rule, msre_var
|
|||||||
|
|
||||||
rc = geo_lookup(msr, &rec, geo_host, error_msg);
|
rc = geo_lookup(msr, &rec, geo_host, error_msg);
|
||||||
if (rc <= 0) {
|
if (rc <= 0) {
|
||||||
*error_msg = apr_psprintf(msr->mp, "Geo lookup for \"%s\" failed at %s.", log_escape_nq(msr->mp, geo_host), var->name);
|
if (! *error_msg) {
|
||||||
|
*error_msg = apr_psprintf(msr->mp, "Geo lookup for \"%s\" failed at %s.", log_escape_nq(msr->mp, geo_host), var->name);
|
||||||
|
}
|
||||||
|
apr_table_clear(msr->geo_vars);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
*error_msg = apr_psprintf(msr->mp, "Geo lookup for \"%s\" succeeded at %s.",
|
if (! *error_msg) {
|
||||||
log_escape_nq(msr->mp, geo_host), var->name);
|
*error_msg = apr_psprintf(msr->mp, "Geo lookup for \"%s\" succeeded at %s.",
|
||||||
|
log_escape_nq(msr->mp, geo_host), var->name);
|
||||||
|
}
|
||||||
|
|
||||||
if (msr->txcfg->debuglog_level >= 9) {
|
if (msr->txcfg->debuglog_level >= 9) {
|
||||||
msr_log(msr, 9, "GEO: %s={country_code=%s, country_code3=%s, country_name=%s, country_continent=%s, region=%s, city=%s, postal_code=%s, latitude=%f, longitude=%f, dma_code=%d, area_code=%d}",
|
msr_log(msr, 9, "GEO: %s={country_code=%s, country_code3=%s, country_name=%s, country_continent=%s, region=%s, city=%s, postal_code=%s, latitude=%f, longitude=%f, dma_code=%d, area_code=%d}",
|
||||||
@ -1229,63 +1234,77 @@ static int msre_op_geoLookup_execute(modsec_rec *msr, msre_rule *rule, msre_var
|
|||||||
}
|
}
|
||||||
|
|
||||||
s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string));
|
s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string));
|
||||||
s->name = apr_pstrdup(msr->mp, "country_code");
|
s->name = apr_pstrdup(msr->mp, "COUNTRY_CODE");
|
||||||
s->name_len = strlen(s->name);
|
s->name_len = strlen(s->name);
|
||||||
s->value = apr_pstrdup(msr->mp, rec.country_code ? rec.country_code : "");
|
s->value = apr_pstrdup(msr->mp, rec.country_code ? rec.country_code : "");
|
||||||
s->value_len = strlen(s->value);
|
s->value_len = strlen(s->value);
|
||||||
apr_table_setn(msr->geo_vars, s->name, (void *)s);
|
apr_table_setn(msr->geo_vars, s->name, (void *)s);
|
||||||
|
|
||||||
s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string));
|
s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string));
|
||||||
s->name = apr_pstrdup(msr->mp, "country_code3");
|
s->name = apr_pstrdup(msr->mp, "COUNTRY_CODE3");
|
||||||
s->name_len = strlen(s->name);
|
s->name_len = strlen(s->name);
|
||||||
s->value = apr_pstrdup(msr->mp, rec.country_code3 ? rec.country_code3 : "");
|
s->value = apr_pstrdup(msr->mp, rec.country_code3 ? rec.country_code3 : "");
|
||||||
s->value_len = strlen(s->value);
|
s->value_len = strlen(s->value);
|
||||||
apr_table_setn(msr->geo_vars, s->name, (void *)s);
|
apr_table_setn(msr->geo_vars, s->name, (void *)s);
|
||||||
|
|
||||||
s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string));
|
s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string));
|
||||||
s->name = apr_pstrdup(msr->mp, "region");
|
s->name = apr_pstrdup(msr->mp, "COUNTRY_NAME");
|
||||||
|
s->name_len = strlen(s->name);
|
||||||
|
s->value = apr_pstrdup(msr->mp, rec.country_name ? rec.country_name : "");
|
||||||
|
s->value_len = strlen(s->value);
|
||||||
|
apr_table_setn(msr->geo_vars, s->name, (void *)s);
|
||||||
|
|
||||||
|
s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string));
|
||||||
|
s->name = apr_pstrdup(msr->mp, "COUNTRY_CONTINENT");
|
||||||
|
s->name_len = strlen(s->name);
|
||||||
|
s->value = apr_pstrdup(msr->mp, rec.country_continent ? rec.country_continent : "");
|
||||||
|
s->value_len = strlen(s->value);
|
||||||
|
apr_table_setn(msr->geo_vars, s->name, (void *)s);
|
||||||
|
|
||||||
|
s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string));
|
||||||
|
s->name = apr_pstrdup(msr->mp, "REGION");
|
||||||
s->name_len = strlen(s->name);
|
s->name_len = strlen(s->name);
|
||||||
s->value = apr_pstrdup(msr->mp, rec.region ? rec.region : "");
|
s->value = apr_pstrdup(msr->mp, rec.region ? rec.region : "");
|
||||||
s->value_len = strlen(s->value);
|
s->value_len = strlen(s->value);
|
||||||
apr_table_setn(msr->geo_vars, s->name, (void *)s);
|
apr_table_setn(msr->geo_vars, s->name, (void *)s);
|
||||||
|
|
||||||
s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string));
|
s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string));
|
||||||
s->name = apr_pstrdup(msr->mp, "city");
|
s->name = apr_pstrdup(msr->mp, "CITY");
|
||||||
s->name_len = strlen(s->name);
|
s->name_len = strlen(s->name);
|
||||||
s->value = apr_pstrdup(msr->mp, rec.city ? rec.city : "");
|
s->value = apr_pstrdup(msr->mp, rec.city ? rec.city : "");
|
||||||
s->value_len = strlen(s->value);
|
s->value_len = strlen(s->value);
|
||||||
apr_table_setn(msr->geo_vars, s->name, (void *)s);
|
apr_table_setn(msr->geo_vars, s->name, (void *)s);
|
||||||
|
|
||||||
s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string));
|
s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string));
|
||||||
s->name = apr_pstrdup(msr->mp, "postal_code");
|
s->name = apr_pstrdup(msr->mp, "POSTAL_CODE");
|
||||||
s->name_len = strlen(s->name);
|
s->name_len = strlen(s->name);
|
||||||
s->value = apr_pstrdup(msr->mp, rec.postal_code ? rec.postal_code : "");
|
s->value = apr_pstrdup(msr->mp, rec.postal_code ? rec.postal_code : "");
|
||||||
s->value_len = strlen(s->value);
|
s->value_len = strlen(s->value);
|
||||||
apr_table_setn(msr->geo_vars, s->name, (void *)s);
|
apr_table_setn(msr->geo_vars, s->name, (void *)s);
|
||||||
|
|
||||||
s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string));
|
s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string));
|
||||||
s->name = apr_pstrdup(msr->mp, "latitude");
|
s->name = apr_pstrdup(msr->mp, "LATITUDE");
|
||||||
s->name_len = strlen(s->name);
|
s->name_len = strlen(s->name);
|
||||||
s->value = apr_psprintf(msr->mp, "%f", rec.latitude);
|
s->value = apr_psprintf(msr->mp, "%f", rec.latitude);
|
||||||
s->value_len = strlen(s->value);
|
s->value_len = strlen(s->value);
|
||||||
apr_table_setn(msr->geo_vars, s->name, (void *)s);
|
apr_table_setn(msr->geo_vars, s->name, (void *)s);
|
||||||
|
|
||||||
s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string));
|
s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string));
|
||||||
s->name = apr_pstrdup(msr->mp, "longitude");
|
s->name = apr_pstrdup(msr->mp, "LONGITUDE");
|
||||||
s->name_len = strlen(s->name);
|
s->name_len = strlen(s->name);
|
||||||
s->value = apr_psprintf(msr->mp, "%f", rec.longitude);
|
s->value = apr_psprintf(msr->mp, "%f", rec.longitude);
|
||||||
s->value_len = strlen(s->value);
|
s->value_len = strlen(s->value);
|
||||||
apr_table_setn(msr->geo_vars, s->name, (void *)s);
|
apr_table_setn(msr->geo_vars, s->name, (void *)s);
|
||||||
|
|
||||||
s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string));
|
s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string));
|
||||||
s->name = apr_pstrdup(msr->mp, "dma_code");
|
s->name = apr_pstrdup(msr->mp, "DMA_CODE");
|
||||||
s->name_len = strlen(s->name);
|
s->name_len = strlen(s->name);
|
||||||
s->value = apr_psprintf(msr->mp, "%d", rec.dma_code);
|
s->value = apr_psprintf(msr->mp, "%d", rec.dma_code);
|
||||||
s->value_len = strlen(s->value);
|
s->value_len = strlen(s->value);
|
||||||
apr_table_setn(msr->geo_vars, s->name, (void *)s);
|
apr_table_setn(msr->geo_vars, s->name, (void *)s);
|
||||||
|
|
||||||
s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string));
|
s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string));
|
||||||
s->name = apr_pstrdup(msr->mp, "area_code");
|
s->name = apr_pstrdup(msr->mp, "AREA_CODE");
|
||||||
s->name_len = strlen(s->name);
|
s->name_len = strlen(s->name);
|
||||||
s->value = apr_psprintf(msr->mp, "%d", rec.area_code);
|
s->value = apr_psprintf(msr->mp, "%d", rec.area_code);
|
||||||
s->value_len = strlen(s->value);
|
s->value_len = strlen(s->value);
|
||||||
|
@ -2282,7 +2282,7 @@ void msre_engine_register_default_variables(msre_engine *engine) {
|
|||||||
msre_engine_variable_register(engine,
|
msre_engine_variable_register(engine,
|
||||||
"GEO",
|
"GEO",
|
||||||
VAR_LIST,
|
VAR_LIST,
|
||||||
1, 1,
|
0, 1,
|
||||||
var_generic_list_validate,
|
var_generic_list_validate,
|
||||||
var_geo_generate,
|
var_geo_generate,
|
||||||
VAR_DONT_CACHE, /* dynamic */
|
VAR_DONT_CACHE, /* dynamic */
|
||||||
|
@ -1 +1,44 @@
|
|||||||
|
### Empty
|
||||||
|
# NOTE: All will return 0 because of lacking DB
|
||||||
|
{
|
||||||
|
type => "op",
|
||||||
|
name => "geoLookup",
|
||||||
|
param => "",
|
||||||
|
input => "",
|
||||||
|
ret => 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type => "op",
|
||||||
|
name => "geoLookup",
|
||||||
|
param => "TestCase",
|
||||||
|
input => "",
|
||||||
|
ret => 0,
|
||||||
|
},
|
||||||
|
|
||||||
|
# Failed Lookup
|
||||||
|
{
|
||||||
|
type => "op",
|
||||||
|
name => "geoLookup",
|
||||||
|
param => "",
|
||||||
|
input => "127.0.0.1",
|
||||||
|
ret => 0,
|
||||||
|
},
|
||||||
|
|
||||||
|
# Good
|
||||||
|
{
|
||||||
|
type => "op",
|
||||||
|
name => "geoLookup",
|
||||||
|
param => "",
|
||||||
|
input => "216.75.21.122",
|
||||||
|
#ret => 1,
|
||||||
|
ret => 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type => "op",
|
||||||
|
name => "geoLookup",
|
||||||
|
param => "",
|
||||||
|
input => "www.modsecurity.org",
|
||||||
|
#ret => 1,
|
||||||
|
ret => 0,
|
||||||
|
},
|
||||||
|
|
||||||
|
@ -415,13 +415,105 @@
|
|||||||
# ),
|
# ),
|
||||||
#},
|
#},
|
||||||
|
|
||||||
|
## ENH: We cannot include this test as we cannot distribute the database.
|
||||||
|
## Instead we should create a simple test DB of our own.
|
||||||
|
## GEO
|
||||||
|
#{
|
||||||
|
# type => "target",
|
||||||
|
# comment => "GEO (ip)",
|
||||||
|
# conf => qq(
|
||||||
|
# SecRuleEngine On
|
||||||
|
# SecDebugLog $ENV{DEBUG_LOG}
|
||||||
|
# SecDebugLogLevel 9
|
||||||
|
# SecGeoLookupDB GeoLiteCity.dat
|
||||||
|
# SecRule ARGS:ip "\@geoLookup" "phase:2,log,pass,t:none"
|
||||||
|
# SecRule GEO:COUNTRY_CODE "\@streq US" "phase:2,log,pass,t:none"
|
||||||
|
# SecRule GEO:COUNTRY_CODE3 "\@streq USA" "phase:2,log,pass,t:none"
|
||||||
|
# SecRule GEO:COUNTRY_NAME "\@streq United States" "phase:2,log,pass,t:none"
|
||||||
|
# # ENH: Not in this database?
|
||||||
|
# SecRule GEO:COUNTRY_CONTINENT "\@streq NA" "phase:2,log,pass,t:none"
|
||||||
|
# SecRule GEO:REGION "\@streq CA" "phase:2,log,pass,t:none"
|
||||||
|
# SecRule GEO:CITY "\@streq San Diego" "phase:2,log,pass,t:none"
|
||||||
|
# SecRule GEO:POSTAL_CODE "\@streq 92123" "phase:2,log,pass,t:none"
|
||||||
|
# SecRule GEO:LATITUDE "\@beginsWith 32.8" "phase:2,log,pass,t:none"
|
||||||
|
# SecRule GEO:LONGITUDE "\@beginsWith 117.1" "phase:2,log,pass,t:none"
|
||||||
|
# SecRule GEO:DMA_CODE "\@streq 825" "phase:2,log,pass,t:none"
|
||||||
|
# SecRule GEO:AREA_CODE "\@streq 858" "phase:2,log,pass,t:none"
|
||||||
|
# ),
|
||||||
|
# match_log => {
|
||||||
|
# debug => [ qr/Geo lookup for "216.75.21.122" succeeded.*match "US" at GEO:COUNTRY_CODE.*match "USA" at GEO:COUNTRY_CODE3.*match "United States" at GEO:COUNTRY_NAME.*match "NA" at GEO:COUNTRY_CONTINENT.*match "CA" at GEO:REGION.*match "San Diego" at GEO:CITY.*match "92123" at GEO:POSTAL_CODE.*match "32.8" at GEO:LATITUDE.*match "825" at GEO:DMA_CODE.*match "858" at GEO:AREA_CODE/si, 1 ],
|
||||||
|
# },
|
||||||
|
# match_response => {
|
||||||
|
# status => qr/^200$/,
|
||||||
|
# },
|
||||||
|
# request => new HTTP::Request(
|
||||||
|
# GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt?ip=216.75.21.122",
|
||||||
|
# ),
|
||||||
|
#},
|
||||||
|
#{
|
||||||
|
# type => "target",
|
||||||
|
# comment => "GEO (host)",
|
||||||
|
# conf => qq(
|
||||||
|
# SecRuleEngine On
|
||||||
|
# SecDebugLog $ENV{DEBUG_LOG}
|
||||||
|
# SecDebugLogLevel 9
|
||||||
|
# SecGeoLookupDB GeoLiteCity.dat
|
||||||
|
# SecRule ARGS:host "\@geoLookup" "phase:2,log,pass,t:none"
|
||||||
|
# SecRule GEO:COUNTRY_CODE "\@streq US" "phase:2,log,pass,t:none"
|
||||||
|
# SecRule GEO:COUNTRY_CODE3 "\@streq USA" "phase:2,log,pass,t:none"
|
||||||
|
# SecRule GEO:COUNTRY_NAME "\@streq United States" "phase:2,log,pass,t:none"
|
||||||
|
# # ENH: Not in this database?
|
||||||
|
# SecRule GEO:COUNTRY_CONTINENT "\@streq NA" "phase:2,log,pass,t:none"
|
||||||
|
# SecRule GEO:REGION "\@streq CA" "phase:2,log,pass,t:none"
|
||||||
|
# SecRule GEO:CITY "\@streq San Diego" "phase:2,log,pass,t:none"
|
||||||
|
# SecRule GEO:POSTAL_CODE "\@streq 92123" "phase:2,log,pass,t:none"
|
||||||
|
# SecRule GEO:LATITUDE "\@beginsWith 32.8" "phase:2,log,pass,t:none"
|
||||||
|
# SecRule GEO:LONGITUDE "\@beginsWith 117.1" "phase:2,log,pass,t:none"
|
||||||
|
# SecRule GEO:DMA_CODE "\@streq 825" "phase:2,log,pass,t:none"
|
||||||
|
# SecRule GEO:AREA_CODE "\@streq 858" "phase:2,log,pass,t:none"
|
||||||
|
# ),
|
||||||
|
# match_log => {
|
||||||
|
# debug => [ qr/Using address "\d+\.\d+\.\d+\.\d+".*Geo lookup for "www\.modsecurity\.org" succeeded.*match "US" at GEO:COUNTRY_CODE.*match "USA" at GEO:COUNTRY_CODE3.*match "United States" at GEO:COUNTRY_NAME.*match "NA" at GEO:COUNTRY_CONTINENT.*match "CA" at GEO:REGION.*match "San Diego" at GEO:CITY.*match "92123" at GEO:POSTAL_CODE.*match "32.8" at GEO:LATITUDE.*match "825" at GEO:DMA_CODE.*match "858" at GEO:AREA_CODE/si, 1 ],
|
||||||
|
# },
|
||||||
|
# match_response => {
|
||||||
|
# status => qr/^200$/,
|
||||||
|
# },
|
||||||
|
# request => new HTTP::Request(
|
||||||
|
# GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt?host=www.modsecurity.org",
|
||||||
|
# ),
|
||||||
|
#},
|
||||||
|
{
|
||||||
|
type => "target",
|
||||||
|
comment => "GEO (failed lookup)",
|
||||||
|
conf => qq(
|
||||||
|
SecRuleEngine On
|
||||||
|
SecDebugLog $ENV{DEBUG_LOG}
|
||||||
|
SecDebugLogLevel 9
|
||||||
|
SecGeoLookupDB GeoLiteCity.dat
|
||||||
|
SecRule REMOTE_ADDR "\@geoLookup" "pass,nolog"
|
||||||
|
SecRule \&GEO "\@eq 0" "deny,status:403,msg:'Failed to lookup IP'"
|
||||||
|
# SecRule ARGS:ip "\@geoLookup" "phase:2,log,pass,t:none"
|
||||||
|
# SecRule \&GEO "\@eq 0" "phase:2,log,deny,status:403,t:none"
|
||||||
|
# SecRule ARGS:badip "\@geoLookup" "phase:2,log,pass,t:none"
|
||||||
|
# SecRule \&GEO "!\@eq 0" "phase:2,log,deny,status:403,t:none"
|
||||||
|
),
|
||||||
|
match_log => {
|
||||||
|
-debug => [ qr/Geo lookup for "127\.0\.0\.1" succeeded/si, 1 ],
|
||||||
|
},
|
||||||
|
match_response => {
|
||||||
|
status => qr/^200$/,
|
||||||
|
},
|
||||||
|
request => new HTTP::Request(
|
||||||
|
GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt?ip=216.75.21.122&badip=127.0.0.1",
|
||||||
|
),
|
||||||
|
},
|
||||||
|
|
||||||
# TODO: ENV
|
# TODO: ENV
|
||||||
# TODO: FILES
|
# TODO: FILES
|
||||||
# TODO: FILES_COMBINED_SIZE
|
# TODO: FILES_COMBINED_SIZE
|
||||||
# TODO: FILES_NAMES
|
# TODO: FILES_NAMES
|
||||||
# TODO: FILES_SIZES
|
# TODO: FILES_SIZES
|
||||||
# TODO: FILES_TMPNAMES
|
# TODO: FILES_TMPNAMES
|
||||||
# TODO: GEO
|
|
||||||
# TODO: HIGHEST_SEVERITY
|
# TODO: HIGHEST_SEVERITY
|
||||||
# TODO: MATCHED_VAR
|
# TODO: MATCHED_VAR
|
||||||
# TODO: MATCHED_VAR_NAME
|
# TODO: MATCHED_VAR_NAME
|
||||||
|
@ -16,13 +16,14 @@
|
|||||||
output => "16",
|
output => "16",
|
||||||
ret => 1,
|
ret => 1,
|
||||||
},
|
},
|
||||||
{
|
# ENH: This sometimes fails w/4096 length
|
||||||
type => "tfn",
|
#{
|
||||||
name => "length",
|
# type => "tfn",
|
||||||
input => ('x' x 8192),
|
# name => "length",
|
||||||
output => "8192",
|
# input => ('x' x 8192),
|
||||||
ret => 1,
|
# output => "8192",
|
||||||
},
|
# ret => 1,
|
||||||
|
#},
|
||||||
|
|
||||||
### With TAB
|
### With TAB
|
||||||
{
|
{
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
Manual</title>
|
Manual</title>
|
||||||
|
|
||||||
<articleinfo>
|
<articleinfo>
|
||||||
<releaseinfo>Version 2.6.0-trunk (April 22, 2009)</releaseinfo>
|
<releaseinfo>Version 2.6.0-trunk (May 15, 2009)</releaseinfo>
|
||||||
|
|
||||||
<copyright>
|
<copyright>
|
||||||
<year>2004-2009</year>
|
<year>2004-2009</year>
|
||||||
@ -2837,7 +2837,7 @@ SecRule <emphasis>ENV:tag</emphasis> "suspicious"</programlisting>
|
|||||||
<title><literal moreinfo="none">GEO</literal></title>
|
<title><literal moreinfo="none">GEO</literal></title>
|
||||||
|
|
||||||
<para><literal>GEO</literal> is a collection populated by the <literal
|
<para><literal>GEO</literal> is a collection populated by the <literal
|
||||||
moreinfo="none">@geoLookups</literal> operator. It can be used to match
|
moreinfo="none">@geoLookup</literal> operator. It can be used to match
|
||||||
geographical fields looked up by an IP address or hostname.</para>
|
geographical fields looked up by an IP address or hostname.</para>
|
||||||
|
|
||||||
<para>Available since 2.2.0.</para>
|
<para>Available since 2.2.0.</para>
|
||||||
@ -2847,7 +2847,7 @@ SecRule <emphasis>ENV:tag</emphasis> "suspicious"</programlisting>
|
|||||||
<itemizedlist>
|
<itemizedlist>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para><emphasis>COUNTRY_CODE:</emphasis> Two character country code.
|
<para><emphasis>COUNTRY_CODE:</emphasis> Two character country code.
|
||||||
EX: US, UK, etc.</para>
|
EX: US, GB, etc.</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
|
||||||
<listitem>
|
<listitem>
|
||||||
@ -2871,24 +2871,28 @@ SecRule <emphasis>ENV:tag</emphasis> "suspicious"</programlisting>
|
|||||||
</listitem>
|
</listitem>
|
||||||
|
|
||||||
<listitem>
|
<listitem>
|
||||||
<para><emphasis>CITY:</emphasis> The city name.</para>
|
<para><emphasis>CITY:</emphasis> The city name if supported by the
|
||||||
|
database.</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
|
||||||
<listitem>
|
<listitem>
|
||||||
<para><emphasis>POSTAL_CODE:</emphasis> The postal code.</para>
|
<para><emphasis>POSTAL_CODE:</emphasis> The postal code if supported
|
||||||
|
by the database.</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
|
||||||
<listitem>
|
<listitem>
|
||||||
<para><emphasis>LATITUDE:</emphasis> The latitude.</para>
|
<para><emphasis>LATITUDE:</emphasis> The latitude if supported by
|
||||||
|
the database.</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
|
||||||
<listitem>
|
<listitem>
|
||||||
<para><emphasis>LONGITUDE:</emphasis> The longitude.</para>
|
<para><emphasis>LONGITUDE:</emphasis> The longitude if supported by
|
||||||
|
the database.</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
|
||||||
<listitem>
|
<listitem>
|
||||||
<para><emphasis>DMA_CODE:</emphasis> The metropolitan area code. (US
|
<para><emphasis>DMA_CODE:</emphasis> The metropolitan area code if
|
||||||
only)</para>
|
supported by the database. (US only)</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
|
||||||
<listitem>
|
<listitem>
|
||||||
@ -2899,8 +2903,8 @@ SecRule <emphasis>ENV:tag</emphasis> "suspicious"</programlisting>
|
|||||||
|
|
||||||
<para>Example:</para>
|
<para>Example:</para>
|
||||||
|
|
||||||
<programlisting format="linespecific">SecRule REMOTE_ADDR "<emphasis>@geoLookup</emphasis>" "chain,drop,msg:'Non-UK IP address'"
|
<programlisting format="linespecific">SecRule REMOTE_ADDR "<emphasis>@geoLookup</emphasis>" "chain,drop,msg:'Non-GB IP address'"
|
||||||
SecRule GEO:COUNTRY_CODE "!@streq UK"</programlisting>
|
SecRule GEO:COUNTRY_CODE "!@streq GB"</programlisting>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
@ -5458,6 +5462,19 @@ SecRule ARGS:route "!<emphasis>@endsWith %{REQUEST_ADDR}</emphasis>" t:none,deny
|
|||||||
moreinfo="none">SecGeoLookupDb</literal> before this operator can be
|
moreinfo="none">SecGeoLookupDb</literal> before this operator can be
|
||||||
used.</para>
|
used.</para>
|
||||||
|
|
||||||
|
<note>
|
||||||
|
<para>This operator matches and the action is executed on a <emphasis>
|
||||||
|
successful</emphasis> lookup. For this reason, you probably want to
|
||||||
|
use the <emphasis>pass,nolog</emphasis> actions. This allows for
|
||||||
|
<literal moreinfo="none">setvar</literal> and other non-disruptive
|
||||||
|
actions to be executed on a match. If you wish to block on a failed
|
||||||
|
lookup, then do something like this (look for an empty GEO
|
||||||
|
collection):</para>
|
||||||
|
|
||||||
|
<programlisting format="linespecific">SecRule REMOTE_ADDR "@geoLookup" "pass,nolog"
|
||||||
|
SecRule &GEO "@eq 0" "deny,status:403,msg:'Failed to lookup IP'"</programlisting>
|
||||||
|
</note>
|
||||||
|
|
||||||
<para>See the <literal moreinfo="none">GEO</literal> variable for an
|
<para>See the <literal moreinfo="none">GEO</literal> variable for an
|
||||||
example and more information on various fields available.</para>
|
example and more information on various fields available.</para>
|
||||||
</section>
|
</section>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user