我知道这是强烈建议永远不要将用户输入作为代码执行,但我很好奇我的特殊情况是否容易受到代码注入的攻击:
- 用户在前端 Web 表单中提供文本输入
- 后端的 Python 脚本接受用户文本输入并使用它来为 R 脚本创建变量名(变量名会删除任何违反 R 变量名语法的字符)
- 我们执行 R 脚本,并将结果返回到前端页面,以便用户可以看到输出
我们有可能受到代码注入的攻击吗?
注意:我们使用 python 的格式语法来插入用户变量;例如:
'{varname} = dataframe${varname}'.format({'varname': stripped_user_provided_variable_name})
答案1
我们有可能受到代码注入的攻击吗?
当然。一般规则是你必须转义/过滤所有用户提供的输入然后您才能在应用程序中的任何地方使用它,而不是简单的文本字符串。
转义/过滤意味着您需要删除用户函数不需要的每个字符。不要只过滤您认为可能危险的内容。如果您需要变量名,那么只接受 [a-zA-Z0-9] 可能是一个好主意。请确保在手册/帮助中记录限制。
还要确保在服务器端进行过滤。仅在客户端进行过滤(Web 表单、Javascript 代码等)并不可靠,因为绕过客户端代码并制作自定义 POST 操作很简单。
如果用户设法制作一个终止当前语句的输入(分号,,\r\n
... - 不知道 R)并将其其余输入解释为另一个语句,那么他们就赢了。