Có cách nào để giới hạn các cuộc gọi được thực hiện trong một phương thức trong lớp của tôi không. Tôi đang sử dụng C# (.NET 4.5). Điều này sẽ được sử dụng như một tính năng bảo mật mã trong khung ứng dụng của chúng tôi.Giới hạn mã trong phương thức chỉ gọi các thành viên trong cùng một lớp
Trả lời
Bạn nên tìm trong hộp cát AppDomain. Nó cho phép bạn tải các plugin vào một AppDomain riêng biệt và gán các quyền thực thi ở một mức độ rất chi tiết.
Running a runtime compiled C# script in a sandbox AppDomain và http://msdn.microsoft.com/en-us/library/bb763046(v=vs.110).aspx nên cung cấp cho bạn một ý tưởng về cách thức tiến hành.
Xin lưu ý rằng tôi muốn kiểm tra các cuộc gọi được thực hiện từ phương pháp Tôi muốn "an toàn" –
Ahh, xin lỗi vì sự hiểu lầm. Đang cập nhật câu trả lời. –
Tôi đã cập nhật câu trả lời của mình để phù hợp hơn với nhu cầu thực tế của bạn. –
Từ How to: Run Partially Trusted Code in a Sandbox
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Security;
using System.Security.Policy;
using System.Security.Permissions;
using System.Reflection;
using System.Runtime.Remoting;
// The Sandboxer class needs to derive from MarshalByRefObject
// so that we can create it in another AppDomain and refer to
// it from the default AppDomain.
class Sandboxer : MarshalByRefObject
{
const string pathToUntrusted = @"..\..\..\UntrustedCode\bin\Debug";
const string untrustedAssembly = "UntrustedCode";
const string untrustedClass = "UntrustedCode.UntrustedClass";
const string entryPoint = "IsFibonacci";
private static Object[] parameters = { 45 };
static void Main()
{
// Setting the AppDomainSetup. It is very important to set the
// ApplicationBase to a folder other than the one in which
// the sandboxer resides.
AppDomainSetup adSetup = new AppDomainSetup();
adSetup.ApplicationBase = Path.GetFullPath(pathToUntrusted);
// Setting the permissions for the AppDomain. We give the permission
// to execute and to read/discover the location where the untrusted
// code is loaded.
PermissionSet permSet = new PermissionSet(PermissionState.None);
permSet.AddPermission(
new SecurityPermission(SecurityPermissionFlag.Execution));
// We want the sandboxer assembly's strong name, so that we can add
// it to the full trust list.
StrongName fullTrustAssembly =
typeof(Sandboxer).Assembly.Evidence.GetHostEvidence<StrongName>();
// Now we have everything we need to create the AppDomain so,
// let's create it.
AppDomain newDomain = AppDomain.CreateDomain(
"Sandbox",
null,
adSetup,
permSet,
fullTrustAssembly);
// Use CreateInstanceFrom to load an instance of the Sandboxer class
// into the new AppDomain.
ObjectHandle handle = Activator.CreateInstanceFrom(
newDomain,
typeof(Sandboxer).Assembly.ManifestModule.FullyQualifiedName,
typeof(Sandboxer).FullName);
// Unwrap the new domain instance into a reference in this domain and
// use it to execute the untrusted code.
Sandboxer newDomainInstance = (Sandboxer)handle.Unwrap();
newDomainInstance.ExecuteUntrustedCode(
untrustedAssembly,
untrustedClass,
entryPoint,
parameters);
}
public void ExecuteUntrustedCode(
string assemblyName,
string typeName,
string entryPoint,
object[] parameters)
{
// Load the MethodInfo for a method in the new Assembly. This might be
// a method you know, or you can use Assembly.EntryPoint to get to the
// main function in an executable.
MethodInfo target =
Assembly.Load(assemblyName)
.GetType(typeName)
.GetMethod(entryPoint);
try
{
//Now invoke the method.
bool retVal = (bool)target.Invoke(null, parameters);
}
catch (Exception ex)
{
// When we print informations from a SecurityException extra
// information can be printed if we are calling it with a
// full-trust stack.
(new PermissionSet(PermissionState.Unrestricted)).Assert();
Console.WriteLine(
"SecurityException caught:\n{0}",
ex);
CodeAccessPermission.RevertAssert();
Console.ReadLine();
}
}
}
- 1. phương thức giới hạn chỉ được gọi bởi một lớp cụ thể
- 2. Gọi phương thức từ phương thức khác trong cùng một lớp trong C++
- 3. Thời gian giới hạn một phương thức trong C#
- 4. Do enums có giới hạn thành viên trong C#?
- 5. Làm cách nào để gọi các biến thành viên của một lớp trong một phương thức tĩnh?
- 6. Gọi phương thức thành viên không tĩnh từ phương thức khác
- 7. Điểm thành viên tham chiếu lớp cho thành viên khác trong cùng một lớp
- 8. Tại sao một phương thức thành viên của lớp được gọi trước khi Constructor
- 9. phương thức gọi lớp php từ phương thức tĩnh bên trong cùng một lớp nhưng không được thực hiện
- 10. Các cuộc gọi chức năng giới hạn trong các nút trên cùng một hoạt động?
- 11. Trả lại thành viên unique_ptr từ phương thức lớp học
- 12. Phương thức gọi trong lớp cha từ các phương thức lớp con trong Ruby
- 13. gọi một phương thức tĩnh bên trong một lớp học?
- 14. gọi phương thức từ phương thức khác trong cùng lớp PHP
- 15. gọi phương thức java trong mã javascript
- 16. Biến thành viên trong các lớp ES6
- 17. Gọi các phương thức Ủy quyền từ một lớp khác
- 18. Gọi phương thức lớp cơ sở từ phương thức quá tải trong lớp phụ
- 19. Các thành viên lớp tĩnh python
- 20. Gọi lại phương thức() trong một lớp khác
- 21. Gọi phương thức lớp động trong Dart
- 22. Các thông số giới hạn Java trong các phương thức chung
- 23. Các phương thức gọi từ một lớp siêu khi một lớp con được khởi tạo
- 24. Giới hạn các loại chung trong C#
- 25. Gọi các phương thức lớp cha mẹ
- 26. Các phương thức cũng được tuần tự hóa cùng với các thành viên dữ liệu trong .NET?
- 27. Gọi các phương thức riêng của một lớp trừu tượng
- 28. Gọi phương thức lớp riêng từ phương thức cá nhân
- 29. Gọi một phương thức phân lớp từ siêu lớp
- 30. động gọi một phương thức lớp trong Objective C
tôi tò mò để xem có ai đi lên với một cách để làm điều đó (Tôi không thể nghĩ ra bất cứ điều gì). Tò mò cũng là trường hợp sử dụng của bạn không chỉ là bảo mật mã chung. – Tim
Bạn đang sử dụng phiên bản .NET nào? –
Chúng tôi đang tải các plugin do khách hàng của chúng tôi viết nên tôi muốn đảm bảo rằng họ chỉ thực thi mã "an toàn". –