>> We probably don't need to go as far as parsing the JSON query to ensure
>> that '%x' substitutions happen only in values and not in keys...
> 
> I think it would be preferable to do this, as it catches human error that
> would result in an insecure system. One just needs to ensure that keys
> keys never have a % that is not followed by another %. JSON syntax rules
> mean that a % cannot appear anywhere else.

This is not too hard to do if you guys think it would make for a safer 
implementation.
Maybe something like this can be added at line 409 (before query_string 
expansion):

bson_iter_t iter;
const char *key = NULL;
query = bson_new_from_json(dict_mongodb->query_filter, -1, &error);
if (!query) {
    msg_warn("%s:%s: failed to create a query from '%s' : %s",
              dict_mongodb->dict.type, dict_mongodb->dict.name,
              vstring_str(dict_mongodb->query_filter), error.message);
    DICT_MONGODB_LOOKUP_ERR_RETURN(DICT_ERR_RETRY);
}
if (bson_iter_init(&iter, query)) {
    while (bson_iter_next(&iter)) {
        key = bson_iter_key(&iter);
        if (strchr(key, '%')) {
            msg_panic("keys in query can not have %% expansions!");
            bson_destroy(query);
            DICT_MONGODB_LOOKUP_ERR_RETURN(DICT_ERR_RETRY);
        }
    }
}
bson_destroy(query);

This code doesn't take into account arrays in query right now. If need be, we 
can create
a function to check keys and iterate arrays as well (for example, the $or 
operator has 
an array of objects as operand, each object has its own keys).

By the way, I have ran all the tests I originally run on my code, and they all 
passed
with the code from 
https://github.com/wietse-postfix/postfix-dukhovni/tree/mongodb

Regards
Hamid Maadani
_______________________________________________
Postfix-devel mailing list -- postfix-devel@postfix.org
To unsubscribe send an email to postfix-devel-le...@postfix.org

Reply via email to