Điểm:1

Nginx khớp với bất kỳ từ nào trong câu lệnh if ngoại trừ một từ

lá cờ cn

Tôi đang sử dụng câu lệnh if sau regex trong nginx config để khớp và chặn một số yêu cầu xấu bên trong request uri. Các truy vấn xấu này luôn chỉ yêu cầu một đối số nhưng mỗi lần đều có tên ngẫu nhiên (và số lượng chữ cái). Họ cũng luôn nhấn trang chủ.

Ví dụ về truy vấn xấu: /?some1bad0query2=nminkvywbjfdysnvhp

if ($request_uri ~ "[\w]{5,25}\=[\w]{5,25}$") {
  trả lại 403;
}

Làm cách nào tôi có thể sửa đổi biểu thức chính quy này để loại trừ việc khớp một số tên đối số như Chìa khóa hoặc truy vấn (tức là /?query=somestring) ?

Tôi đã cố gắng sử dụng dấu ngoặc tròn và ?(!truy vấn) nhưng không có may mắn.

Xin hãy giúp tôi sửa câu lệnh regex này. Cảm ơn trước.

Richard Smith avatar
lá cờ jp
Đó có phải chỉ là một ví dụ tồi không, bởi vì `query=somestring` dù sao cũng không khớp với biểu thức chính quy của bạn, vì `query` dài dưới 6 ký tự?
lá cờ cn
vâng chắc chắn nó đã sai. regex đã sửa để bắt đầu với tên đối số dài 5 (truy vấn). nhưng tôi vẫn cần một ví dụ về cách tôi có thể giảm thiểu cuộc tấn công này và bỏ qua danh sách trắng đối số tốt như vậy (như truy vấn, tìm kiếm, v.v.)
Điểm:0
lá cờ jp

Có hai cách để làm điều này. Sử dụng một khẳng định nhìn trước tiêu cực hoặc sử dụng một bản đồ.

Ví dụ:

if ($request_uri ~ "(?!query)\w{5,25}=\w{5,25}$") { return 403; }

lợi thế của bản đồ là các biểu thức chính quy được đánh giá theo thứ tự cho đến khi tìm thấy kết quả phù hợp, vì vậy có thể tránh được các biểu thức tra cứu phức tạp.

Ví dụ:

bản đồ $request_uri $reject {
    ~*^/\?query= 0;
    "~*^/\?\w{5,25}=\w{5,25}$" 1;
}
người phục vụ {
    ...
    nếu ($ từ chối) { trả lại 403; }
    ...
}

Các bản đồ chặn cuộc sống bên ngoài người phục vụ chặn. Nếu quy tắc chỉ áp dụng cho các URI bắt đầu bằng /?, bạn nên thêm nó vào biểu thức chính quy (như trong ví dụ thứ hai của tôi).

lá cờ cn
Cảm ơn, Richard! Bản đồ dường như là giải pháp thanh lịch hơn đối với tôi. Đã thử nghiệm và nó hoạt động hoàn hảo. btw. lỗi của tôi trong câu lệnh if là tôi đã đặt ?! chặn sau đối số

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.