Puncte:0

NGINX direcționează către gazda virtuală greșită atunci când antetul gazdei conține caractere două puncte

drapel cn

Nginx.conf meu are mai multe secțiuni „server” și o secțiune de server catch-all. Iată un exemplu de nginx.conf pentru a vă face o idee:

utilizator www-date;
worker_proceses auto;
worker_cpu_affinity auto;
pid /run/nginx.pid;

evenimente {
    muncitor_conexiuni 4000;
    utilizați epoll;
    accept_mutex dezactivat;
}

http {
    includ /etc/nginx/mime.types;
    aplicație de tip_default/octet-stream;
    error_log /var/log/nginx/error.log;

    Server {
        asculta 80;

        nume_server foo.com;

        Locație / {
            default_type text/plain;
            returnează 200 „bună ziua de la foo.com”;
        }

        pagina_eroare 500 502 503 504 /500.html;
    }

    Server {
        asculta 80 default_server;
        numele serverului _;

        Locație / {
            returnează 403 „scuze”;
        }
    }

}

Mă aștept ca serverul să returneze 403 dacă antetul „Gazdă” este altceva decât „foo.com”.

Se pare că cineva rulează Burp Suite pe serverul meu și am observat un comportament interesant când trimit un antet „Gazdă: foo.com:more-stuff-here”: NGINX direcționează cererea către prima secțiune „server”. Se pare că ignoră două puncte și tot ce se află după el în valoarea antetului.

Îl pot reproduce local cu nginx.conf de mai sus:

$ curl -H „Gazdă: foo.com” http://127.0.0.1
salutare de la foo.com

$ curl -H „Gazdă: foo.com:unexpected-content” http://127.0.0.1
salutare de la foo.com

$ curl -H „Gazdă: bar.com” http://127.0.0.1
scuze

De ce face NGINX asta? Este acesta un comportament așteptat? Ce ar trebui să schimb în nginx.conf pentru a mă asigura că solicitările cu antetul „Host: foo.com:more-stuff-here” ajung la blocul implicit?

Actualizați: Pentru oricine care cercetează aceeași problemă, am creat și eu un bilet în trackerul problemelor NGINX.

djdomi avatar
drapel za
sublinierea invalidează numele gazdei și îl face implicit
Pēteris Caune avatar
drapel cn
@djdomi â documentele nginx spun că litera de subliniere nu are o semnificație specială, este doar un nume de gazdă nevalid. Bitul important este „default_server” în directiva listen. Sunt confuz de ce nginx tratează valoarea gazdă „foo.com:uneexpected-content” ca o potrivire directă pentru numele serverului „foo.com”.
Puncte:3
drapel in

Definiția antetului gazdă în HTTP RFC indică faptul că antetul gazdă ar trebui să aibă forma gazdă:port, cu :port fiind optional.

nginx vede totul după două puncte ca port pentru gazdă, dar este irelevant în contextul dvs., deoarece nu ați specificat un bloc de server în acest fel. Deci folosește cea mai apropiată potrivire pe care o poate găsi, gazda fără „port”.

Pēteris Caune avatar
drapel cn
Ah văd. Ce pot face pentru a remedia asta? Este posibil să faceți ca nginx să ignore solicitările cu valori de port nevalide?
drapel in
Este problema ta că o aplicație care trimite solicitări nevalide nu funcționează corect? Dacă da, aș repara aplicația, dacă nu, aș ignora-o.
drapel in
Singura opțiune la care mă pot gândi ar fi să încerc să adaug `foo.com:*` ca alias server la gazda implicită și să sper că nginx este suficient de inteligent pentru a-l distinge.
Pēteris Caune avatar
drapel cn
Aplicația mea generează un avertisment despre un antet gazdă nevalid. Pot să tac avertismentul, dar aș prefera ca NGINX să detecteze cererile nevalide înainte ca acestea să ajungă la aplicație.
Pēteris Caune avatar
drapel cn
Am testat `foo.com:*`, NGINX nu pornește și afișează o eroare: `nume server sau wildcard nevalid "foo.com:*"`
drapel in
M-am gândit atât de mult. Ei bine, atunci nu cred că poți face nimic din partea nginx. Acest lucru ar trebui să fie remediat în aplicația care face cereri nevalide.
Puncte:0
drapel us

Următoarele ar putea funcționa pentru implicit_server:

Server {
    asculta 80 default_server;

    nume_server _ ~exemplu\.com:;

    Locație / {
        returnează 403 „scuze”;
    }
}

Partea importantă este tilda ~, care indică o potrivire a expresiei regulate.

Pēteris Caune avatar
drapel cn
Idee bună, dar nu pare să funcționeze pentru mine â solicitarea este în continuare direcționată către cealaltă secțiune de server.
Puncte:0
drapel tl

Singura alternativă la care m-aș putea gândi ar fi să codific ceva la nivelul aplicației de pe partea serverului pentru a verifica valoarea gazdei și a returna răspunsul 403 în cod.

Totuși, aceasta nu este cu adevărat modalitatea corectă de a face acest lucru, deoarece problema este o problemă a clientului de rezolvat și nu pentru aplicația dvs.

de exemplu, luând din acest ASA raspuns Având în vedere o aplicație PHP, puteți modifica cu ușurință această logică pentru a obține efectul dorit, rețineți în mod special verificarea pentru SERVER_PORT conform Răspunsul lui Gerald

$allowed_hosts = array('foo.example.com', 'bar.example.com');
$allowed_ports = array(80,443);
if (!isset($_SERVER['HTTP_HOST']) || !in_array($_SERVER['HTTP_HOST'], $allowed_hosts) || !in_array($_SERVER['SERVER_PORT'], $allowed_ports )) {
    antet($_SERVER['SERVER_PROTOCOL'].' 400 Solicitare greșită');
    Ieșire;
}
Pēteris Caune avatar
drapel cn
Multumesc pentru raspuns. Așa funcționează în prezent pentru mine aici (aplicația de backend folosește cadrul web Django, care verifică antetul gazdei cu o listă de permise. Este în regulă, dar speram să fac ca NGINX să acționeze ca un „scut” în fața aplicației de backend. , asigurându-vă că numai cererile valide și bine formate ajung la aplicația backend)

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.