【发布时间】:2021-03-12 04:33:19
【问题描述】:
为了给我的用户更大的灵活性并让他们编写自己的表达式,我想让他们在文本字段中编写非常简单的 C# 语句,这些语句在服务器端执行以进行一些自定义计算。
我正在与 Roslyn 一起存档。
可以在here 找到一个很好的例子。
我让用户在评估函数中注入代码,如下所示:
string codeToCompile = @"
using System;
using System.Collections.Generic;
namespace Evaluator
{
public class Evaluator
{
public string Eval()
{
" + {POTENTIALLY_DANGEROUS_CODE_GOES_HERE} + @"
}
}
}";
您可以看到注入的代码总是在一个 Eval-Function 中,最后应该返回一个字符串。
用户可以决定如何计算这个字符串。
我现在正在考虑安全性,因为我无法控制注入的代码。
实际上我的用户应该只能:
- 使用数学表达式
- 原始变量
- if 语句
因此,注入代码的示例可能如下所示:
int a = 5;
int b = 10;
if(a < b)
{
return "a is smaller";
}
else
{
return "a is bigger or equal";
}
您可以在上面的示例代码中看到,命名空间仅限于“System”和“System.Collections.Generic”,所以很多东西都不再可能(比如从服务器的文件系统中读取一些东西)并将此信息作为字符串输出)
我还替换了所有出现的循环,因此 while、for、foreach 等表达式从字符串中删除。
但我仍然不确定这个解决方案是否安全。
- 潜在的攻击者现在还能做什么? (尤其是提供的两个命名空间的选项)
- 在这种情况下我可以采取什么最佳做法来防止攻击?
【问题讨论】:
-
此链接将帮助您实现基础架构以在服务器上执行安全代码。 stackoverflow.com/questions/45231392/…
标签: c# security roslyn code-injection roslyn-code-analysis