2011-04-29 28 views
13

Điều gì sau đây có nguy hiểm không?JSON có an toàn để sử dụng làm đối số dòng lệnh hay không cần phải được khử trùng trước?

$ myscript '<somejsoncreatedfromuserdata>' 

Nếu có, tôi có thể làm gì để không gây nguy hiểm?

Tôi nhận ra rằng điều này có thể phụ thuộc vào hệ vỏ, hệ điều hành, tiện ích được sử dụng để thực hiện cuộc gọi hệ thống (nếu được thực hiện bên trong ngôn ngữ lập trình), v.v. cho.

+0

AFAIK, điều này sẽ không có hại vì JSON hợp lệ và hợp lệ luôn luôn có các khung bao quanh nó, cho đến khi và trừ khi bạn đang chạy bất kỳ tham số nào từ JSON trên dòng lệnh, bạn sẽ được an toàn. –

+0

Bạn có kiểm soát đầu vào và xử lý của nó không? Bạn làm gì với đối tượng json khi nhận được? – ljkyser

+0

Trong ví dụ lý thuyết này, một khi tôi nhận được đầu vào tôi loại bỏ nó hoặc làm bất cứ điều gì an toàn tôi muốn với nó. Tôi chỉ muốn biết làm thế nào nó dễ dàng cho một số lĩnh vực bên trong JSON để thoát khỏi các dấu ngoặc kép làm một số loại tấn công tiêm dòng lệnh. –

Trả lời

14

Có. Đó là nguy hiểm.

JSON có thể bao gồm dấu ngoặc đơn trong giá trị chuỗi (chúng không cần phải được thoát). Xem "bản nhạc" tại số json.org.

Hãy tưởng tượng các dữ liệu là:

{"pwned": "you' & kill world;"} 

Chúc mừng mã hóa.


tôi sẽ xem xét đường ống dữ liệu vào chương trình trong câu hỏi (ví dụ như sử dụng "popen" hoặc thậm chí là một phiên bản của "exec" mà đi tranh luận trực tiếp) - điều này có thể tránh được các vấn đề phát sinh từ đi qua vỏ, ví dụ . Cũng giống như với SQL: sử dụng trình giữ chỗ loại bỏ sự cần thiết phải trifle với "thoát".


Nếu đi qua một lớp vỏ là cách duy nhất, thì đây có thể là một lựa chọn (nó không được kiểm tra, nhưng một cái gì đó tương tự như giữ cho một "< script>" ngữ cảnh):

Đối với mỗi nhân vật trong JSON, nằm ngoài phạm vi "không gian" thành "~" trong ASCII hoặc có ý nghĩa đặc biệt trong ngữ cảnh '' của vỏ như \' (nhưng không bao gồm " hoặc bất kỳ ký tự nào khác - chẳng hạn như dưới dạng chữ số - có thể xuất hiện bên ngoài dữ liệu "chuỗi", đây là giới hạn của cách tiếp cận tầm thường này), sau đó mã hóa ode ký tự sử dụng mẫu JSON \uXXXX. (Mỗi giới hạn được xác định ở trên này chỉ nên mã hóa các ký tự có khả năng gây hại xuất hiện trong "chuỗi" trong JSON và không nên có các cặp \\, không có dấu \ và không ' s, v.v.)

+1

Đậu mát. Tôi đang thực sự sử dụng mô-đun con trăn con, vì vậy tôi khá chắc chắn rằng tôi sẽ được an toàn với lớp Popen, nhưng vẫn tò mò nói chung. –

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