Cũng giống như tiêu đề cho biết: Điều gì, nếu có, là những tác động an ninh cần được xem xét khi sử dụng và/hoặc đi qua các phương pháp ẩn danh (Action<>
, Func<>
) trong C#?Các tác động bảo mật cho việc chấp nhận các phương thức nặc danh (Action <>, Func <>) như các tham số là gì?
Phương thức chấp nhận Action<>
/Func<>
có vẻ là cách tiềm năng để mã ngoại được đưa vào chương trình. Đối với hồ sơ, tôi hiểu rằng phương pháp hoặc chức năng được tiêm không thể thực hiện những điều không an toàn vốn có trong ý nghĩa truy cập bộ nhớ tùy ý, nhưng tôi nghĩ rằng nó có thể cho phép mã gọi điện thoại, ví dụ: tùy ý các chức năng khung .Net, dữ liệu bị hỏng hoặc làm cho ứng dụng bị lỗi.
Giả định này có sai không?
Nếu không, bạn nên làm gì để khóa những thứ này? Ngoài ra, có cách nào để xác thực
/Func<>
được chuyển vào một phương thức hoặc chức năng để đảm bảo rằng nó có dạng mong muốn hoặc hạn chế quyền truy cập của nó đối với một số loại và không gian tên nhất định không?
Ngoài ra, hãy tha thứ cho tôi nếu tôi không sử dụng đúng thuật ngữ đúng, tôi vẫn đang học.
Cũng lưu ý rằng bạn có thể tiêm mã độc thông qua kế thừa (bằng cách ghi đè các phương thức ảo và trừu tượng) và triển khai giao diện. Nhưng câu trả lời của SLaks cũng áp dụng cho những trường hợp này. Ví dụ, lớp 'System.String' bảo vệ chính nó khỏi bị niêm phong. –
Kịch bản là gì?Mã đáng tin cậy và không đáng tin cậy trong cùng một quy trình được phân cách bởi CAS? – usr
@usr Tôi thực sự hỏi nếu có * là * kịch bản trong đó có bất kỳ mối quan tâm nào. Tôi đã nhìn thấy một số giải pháp trên đây mà sử dụng như một cách để, ví dụ, vượt qua một getter tài sản hoặc setter đến một phương pháp được đặt tên bằng cách gói nó trong một trong những. Nhưng điều đó cảm thấy không chính xác bởi vì không có cách nào, theo như tôi biết, đối với phương thức được đặt tên để đảm bảo hoặc bảo đảm rằng Hành động được truyền <> hoặc Func <> đang hoạt động theo cách mong đợi. Có phải đó là thực hành xấu để sử dụng chúng như các tham số trừ khi phương pháp được đặt tên thực sự không quan tâm những gì nó làm? Ví dụ. Assert.ThrowsException(). –