аутентификация hmac в vcl - PullRequest
       9

аутентификация hmac в vcl

0 голосов
/ 27 апреля 2018

Я пытаюсь аутентифицировать URL с помощью Hamc. Я могу сделать следующее, чтобы проверить. Мой вопрос заключается в том, как мне разобрать URL, чтобы извлечь только часть URL, исключая параметр hmac. Я пытался использовать локальные переменные в Vcl, но он выдал ошибку. Любые предложения о том, как извлечь значение hmac и параметры запроса URL, как показано ниже.

http://localhost/zzz/?q1=xxx&q2=yyy&hmac=hash

if (digest.hmac_md5("key", "q1=xxx&q2=yyy") != "value")
      {
          return (synth(401, digest.hmac_md5("key", "http://localhost/zzz/?q1=xxx&q2=yyy")));
      }

Спасибо

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

внешний плагин не нужен, в этом случае вы можете просто удалить параметр строки запроса hmac=XXX из req.url и сохранить результат в новой переменной req.http.url_without_hmac и req.http.hmac до digest.hmac_md5

см. Пример теста:

varnishtest "Strip query parameter"

server s1 {
       rxreq
       txresp
       rxreq
       txresp

} -start

varnish v1 -vcl+backend {
    import std;

    sub vcl_recv {
      # Strip out HMAC parameter

    # get only the query string, ignore uri
    set req.http.qs = regsuball(req.url, ".*\?(.*?)$", "?\1");

    # strip hmac= from the qs
    set req.http.url_without_hmac = regsuball(req.http.qs,"\?hmac=[^&]+$",""); # strips when QS = "?hmac=AAA"
    set req.http.url_without_hmac = regsuball(req.http.url_without_hmac,"\?hmac=[^&]+&","?"); # strips when QS = "?hmac=AAA&foo=bar"
    set req.http.url_without_hmac = regsuball(req.http.url_without_hmac,"&hmac=[^&]+",""); # strips when QS = "?foo=bar&hmac=AAA" or QS = "?foo=bar&hmac=AAA&bar=baz"

    # remove the leading ? from the url_without_hmac
    set req.http.url_without_hmac = regsuball(req.http.url_without_hmac,"^\?(.*)$", "\1");

    # extract the hmac= value from the req.http.qs
    set req.http.hmac = regsuball(req.http.qs, ".*[?&]hmac=([^&]*).*", "\1");
    # NOW USE req.http.url_without_hmac for your digest validation and req.http.hmac as the value


    }

    sub vcl_deliver {
        set resp.http.url_without_hmac = req.http.url_without_hmac;
        set resp.http.hmac = req.http.hmac;
    }
} -start

client c1 {
    txreq  -url "/1?a=1&hmac=2&b=1"
    rxresp
    expect resp.http.url_without_hmac ==  "a=1&b=1"
    expect resp.http.hmac ==   "2"


} -run


client c2 {
    txreq  -url "/1?hmac=hello&a=1&b=1"
    rxresp
    expect resp.http.url_without_hmac ==  "a=1&b=1"
    expect resp.http.hmac ==  "hello"


} -run
0 голосов
/ 08 мая 2018

Вы захотите использовать [querystring][1] vmod. Насколько я знаю, он не поставляется предварительно упакованным, поэтому вам нужно будет его собрать, но он должен делать именно то, что вам нужно.

С этим вы можете определить регулярные выражения / статические значения для соответствия аргументам строки запроса, а затем отфильтровать их или в.

...