2008-09-18 22 views
5

Tôi đang phát triển một ứng dụng và có URL ở định dạng www.example.com/some_url/some_parameter/some_keyword. Tôi biết bằng cách thiết kế rằng có độ dài tối đa mà các URL này sẽ có (và vẫn hợp lệ). Tôi có nên xác nhận độ dài URL với mọi yêu cầu để bảo vệ chống lại các cuộc tấn công tràn/tràn bộ đệm không? Tôi tin rằng đây là một rõ ràng có nhưng tôi không phải là một chuyên gia an ninh vì vậy có lẽ tôi đang thiếu một cái gì đó.Tôi có nên từ chối URL dài hơn những gì được mong đợi không?

+0

Kỹ thuật tương tự được sử dụng bởi Tường lửa ứng dụng web nếu bạn quan tâm đến nghiên cứu thêm. –

Trả lời

5

Nếu bạn không mong đợi đầu vào đó, hãy từ chối nó.

Bạn nên luôn xác thực các yếu tố đầu vào của mình và chắc chắn hủy mọi thứ ngoài phạm vi dự kiến. Nếu bạn đã biết rằng URL của bạn trung thực sẽ không vượt quá một độ dài nhất định sau đó từ chối nó trước khi nó được vào ứng dụng có vẻ khôn ngoan.

1

làm cách nào để bạn chắc chắn rằng tất cả URL dài hơn N không hợp lệ? Nếu bạn có thể chắc chắn, thì nó không nên làm tổn thương để giới hạn nó chỉ như một kiểm tra sanity - nhưng đừng để điều này đánh lừa bạn nghĩ rằng bạn đã ngăn chặn một lớp khai thác.

0

Tôi nghĩ rằng điều này có thể cung cấp cho bạn một số mức độ an toàn và có thể giúp bạn tiết kiệm ít băng thông nếu mọi người gửi cho bạn URL dài điên rồ, nhưng phần lớn bạn cũng nên xác thực dữ liệu của mình trong ứng dụng thực tế. Nhiều mức độ bảo mật nói chung là tốt hơn, nhưng đừng mắc sai lầm khi nghĩ rằng vì bạn có một biện pháp bảo vệ (yếu) ngay từ đầu mà bạn sẽ không gặp vấn đề gì với phần còn lại.

0

Tôi muốn nói không. Nó chỉ là bảo mật giả. Chỉ cần lập trình tốt và kiểm tra các yêu cầu của bạn về nội dung xấu. Nó là đủ.

Ngoài ra, đó không phải là bằng chứng trong tương lai.

+0

Hầu như. Kiểm tra yêu cầu của bạn về công cụ _good_ chứ không phải nội dung xấu. Sẽ luôn có những điều tồi tệ mà bạn chưa từng nghĩ đến, nó dễ dàng hơn nhiều để chỉ cho phép những điều tốt đẹp (gần như luôn luôn dễ xác định hơn). –

0

Có. Nếu quá dài và bạn chắc chắn sẽ từ chối nó càng sớm càng tốt. Nếu bạn có thể, từ chối nó trước khi nó đạt đến ứng dụng của bạn (ví dụ IISLockdown sẽ làm điều này).

Hãy nhớ tính đến mã hóa ký tự.

0

Tốt hơn chiều dài kiểm tra, tôi nghĩ bạn nên kiểm tra nội dung. Bạn không bao giờ biết cách bạn sẽ sử dụng lược đồ URL của mình trong tương lai, nhưng bạn luôn có thể khử trùng các đầu vào của mình. Để đặt một điều rất phức tạp rất đơn giản: Đừng tin tưởng dữ liệu do người dùng cung cấp. Đừng đặt nó trực tiếp vào các truy vấn DB, đừng eval() nó, đừng lấy bất cứ điều gì cho phép.

0

Nếu bạn biết URL hợp lệ không được vượt quá N byte thì có vẻ như là cách tốt để nhanh chóng từ chối các nỗ lực tạo tập lệnh chéo mà không cần nỗ lực quá nhiều.

1

Điều duy nhất tôi có thể thấy có thể gây ra sự cố là trong khi ngày nay URL của bạn sẽ không bao giờ vượt quá N, bạn không thể đảm bảo rằng điều đó sẽ không xảy ra mãi mãi. Và trong một năm, khi bạn quay lại để thực hiện chỉnh sửa để cho phép url dài N + y, bạn có thể quên sửa đổi mã từ chối url.

Bạn sẽ luôn tốt hơn khi xác minh thông số URL trước khi sử dụng chúng.

0

Tốt hơn là xác thực số trong yêu cầu hơn xác thực độ dài URL.

Nhu cầu của bạn có thể thay đổi trong tương lai, tại thời điểm đó, bạn sẽ phải xóa hoặc thay đổi xác thực độ dài URL, có thể giới thiệu lỗi.

Nếu nó kết thúc như một lỗ hổng bảo mật đã được chứng minh, thì bạn có thể thực hiện nó.

5

Quốc phòng chuyên sâu là một nguyên tắc tốt. Nhưng các biện pháp an ninh sai là một nguyên tắc xấu. Sự khác biệt phụ thuộc vào rất nhiều chi tiết.

Nếu bạn thực sự tự tin rằng bất kỳ URL nào trên N không hợp lệ, thì bạn cũng có thể từ chối URL đó. Nhưng nếu đó là sự thật, và nếu phần còn lại của xác nhận đầu vào của bạn là chính xác, sau đó nó sẽ bị từ chối sau này anyway. Vì vậy, tất cả các kiểm tra này không có khả năng, có thể, giảm thiểu thiệt hại gây ra bởi một số lỗi khác trong mã của bạn. Nó thường tốt hơn để dành thời gian của bạn suy nghĩ làm thế nào để tránh những lỗi, hơn là suy nghĩ về những gì N có thể được.

Nếu bạn kiểm tra độ dài, tốt nhất là bạn không nên dựa vào giới hạn độ dài này ở nơi khác trong mã của bạn. Làm như vậy các cặp vợ chồng kiểm tra chặt chẽ hơn với nhau, và làm cho nó khó khăn hơn để thay đổi giới hạn trong phiên bản tiếp theo, nếu bạn thay đổi spec và cần phải chấp nhận các URL dài hơn. Ví dụ: nếu giới hạn độ dài trở thành một cái cớ để đặt các URL trên ngăn xếp mà không cần quan tâm và chú ý, thì bạn có thể đang thiết lập một người nào đó cho một mùa thu.

0

Ok, giả sử N tồn tại như vậy. Như đã nói ở trên, một URL không đúng định dạng dài hơn N ký tự sẽ bị từ chối bởi xác thực đầu vào khác. Tuy nhiên, trong mắt tôi, điều này mở ra một điều hoàn toàn mới để suy nghĩ về:

Sử dụng hằng số này, bạn có thể xác thực xác thực khác của mình. Tuy nhiên, nếu các xác thực khác không thể phát hiện một URL nhất định là không hợp lệ, URL dài hơn N ký tự, URL này sẽ kích hoạt lỗi và cần được ghi lại (và có thể toàn bộ ứng dụng sẽ bị tắt, vì chúng có thể tạo URL không hợp lệ đủ ngắn).

1

Safari, Internet Explorer và Firefox đều có độ dài tối đa khác nhau mà nó chấp nhận.

Tôi bỏ phiếu đi cho ngắn nhất trong cả ba.

http://www.boutell.com/newfaq/misc/urllength.html

Kéo từ liên kết -

"Microsoft Internet Explorer (trình duyệt) - 2.083 ký tự

Firefox (trình duyệt) - Sau khi 65.536 ký tự, thanh địa chỉ không còn hiển thị URL trong Windows Firefox 1.5.x. Tuy nhiên, các URL dài hơn sẽ hoạt động. Tôi đã ngừng thử nghiệm sau 100.000 ký tự.

Safari (Trình duyệt) - Ít nhất 80.000 ký tự sẽ hoạt động. "

+0

Cảm ơn! Chỉ là thứ tôi cần tìm. – Volomike

0

Ôi, rất nhiều câu trả lời, rất nhiều điểm tốt, vì vậy hãy trải ra, vì vậy hãy để tôi cố gắng củng cố tất cả điều này. tl; dr imo, mức độ quá thấp này là mối quan ngại đối với mã lớp ứng dụng.

Có, URL có thể là bất kỳ chiều dài nào nhưng trên thực tế, trình duyệt có giới hạn. Tất nhiên, điều đó chỉ bảo vệ bạn khỏi các cuộc tấn công dựa trên trình duyệt bởi những người sẵn sàng giới hạn bản thân họ với những vectơ đó, vì vậy bạn cần một số cách để xử lý các nỗ lực tấn công đang hoạt động.

Ok, nó có thể bảo vệ chống lại tràn bộ đệm. Vâng, chỉ khi bạn đang làm việc ở mức độ thấp và không suy nghĩ về những mối quan tâm như vậy. Hầu hết các ngôn ngữ những ngày này hỗ trợ các chuỗi khá tốt và sẽ không cho phép chúng tràn.Nếu bạn đang xử lý một số hệ thống mức rất thấp, thực sự đọc dữ liệu dưới dạng byte và đặt nó thành kiểu 'chuỗi', thì chắc chắn, bạn nên có cách phát hiện và xử lý điều này, nhưng không khó để cấp phát bộ nhớ, và chuyển số tiền đã biết tại một thời điểm, chỉ cần theo dõi lượng bộ nhớ bạn đã dành. Thành thật mà nói nếu bạn đang đối phó với mức thấp đó, bạn thực sự nên sử dụng cái gì khác.

Ok, điều gì về việc từ chối dựa trên độ dài chuỗi? Sự rút lại chính cho điều này là tiềm năng cho một cảm giác an toàn sai lầm. Đó là để nói, một số khu vực của mã có thể nhận được 'cẩu thả' và dễ bị tổn thương đến những khai thác rất bạn đang cố gắng để tránh. Bạn rõ ràng phải cẩn thận để đảm bảo giới hạn 'toàn cầu' này thực sự là đủ, nhưng xem xét định dạng URI của bạn, bạn có thể có báo cáo 'phần' đó về độ dài tối đa của chúng và kiểm tra độ dài trung tâm (cho cả hai toàn bộ chuỗi, và các thành phần của nó); ít nhất theo cách này, nếu một phần cần cho phép chuỗi dài hơn, thì việc xử lý thay đổi sẽ dễ dàng hơn.

Điều này tất nhiên có một số lợi thế, vì một, rất nhanh để có thể so sánh độ dài của chuỗi và từ chối yêu cầu ngay lập tức ... nhưng đừng quên là 'cư xử tốt 'trang web bạn nên gửi lại một phản ứng thích hợp giải thích lý do tại sao máy chủ đang từ chối điều này. Tuy nhiên, trong thực tế, bạn có thực sự nghĩ rằng bạn sẽ phải xử lý nhiều loại URL 'sai' này, chắc chắn chúng sẽ sai theo nhiều cách khác nhau.

Vì lý do nào đó, bạn cảm thấy không muốn nói ngôn ngữ mình đang sử dụng. Các ngôn ngữ cấp cao như Java hay Python có một số thư viện rất tốt để xử lý 'công cụ web'. Java sẽ cho phép bạn chỉ định các mẫu cho URI, bao gồm việc sử dụng regex cho mẫu đó, vì vậy nếu bạn muốn có tên trong URL, bạn có thể có một cái gì đó như @Path("/person/(.{0..100}") để giới hạn tham số thành 100 ký tự. Tôi sẽ ngạc nhiên nếu như Ruby hoặc Python không có tương đương, họ muốn quảng bá bản thân như những ngôn ngữ 'webby' tốt đẹp.

Cuối cùng, bất kể độ dài, có nhiều những thứ bạn sẽ cần phải xác thực, không chỉ chiều dài. Phải lo lắng về độ dài của URI gây tràn bộ đệm là một điều rất thấp, và sẽ cần phải rất chung chung, tức là cần phải xử lý bất kỳ yêu cầu nào, ngay cả một yêu cầu có URI 1 GB; lưu ý tôi nói 'xử lý' không 'chấp nhận nó một vượt qua nó lên đến lớp ứng dụng', nó có thể từ chối nó ở mức độ thấp, cũng kích hoạt sự kiện hệ thống có thể.

Các vấn đề liên quan