从SAS存储过程参数中清除用户输入的安全方法是什么?
SAS存储过程可以通过参数接受用户输入。在较高级别,这些用户输入可能包含将导致SAS问题的特殊文本。
例如,如果用户将Bad“Text输入到lastName,则以下代码存在问题:
Proc SQL;
Select *
From Foo
Where Bar = "&LastName";
Quit;
防止这个特定实例很容易,但如果用户试图注入代码该怎么办。
如果用户包含“%&”等目标字符,则替换宏变量中的所有内容是不够的。
是否有一个强大的解决方案可以转义以后需要使用的宏变量中的特殊字符,在这种情况下是在传递SQL语句的where子句中?
答案 0 :(得分:2)
SAS存储过程服务器应该已经保护您的SAS会话免受客户端尝试注入。
来自"SAS 9.1.3 Integration Technologies » Developer's Guide"
特殊字符引用
输入参数值由。指定 运行时存储的进程客户端。存储过程的作者有 几乎无法控制客户端可以指定的值。设置 值直接进入SAS宏变量将允许客户端插入 可执行宏代码进入存储过程并可能导致 意外行为或不可接受的安全风险。例如,如果是 名为COMP的输入参数设置为“Jones& Comp。”并通过 直接进入宏变量,任何对& COMP的引用 存储过程程序会导致无效的递归宏 参考。为避免此问题,屏蔽了存储的过程参数 在设置为宏之前使用SAS宏引用函数 变量。在前面的示例中,将设置参数COMP 相当于:
%let COMP=%nrstr(Jones&Comp.);
存储的 然后,过程可以自由使用& COMP而无需特殊处理 输入值。为输入参数屏蔽的特殊字符 是&符号(&),撇号('),百分号(%),引用 标记(“)和分号(;)。
可能有特殊情况 想要取消屏蔽输入中的部分或全部特殊字符 参数。STPSRV_UNQUOTE2
函数取消屏蔽仅匹配 撇号(')或引号(“)字符。这可能很有用 用于传递用作SAS选项的参数。%UNQUOTE
宏函数取消引用输入参数中的所有字符,但是你 应该只在非常有限的情况下使用此功能。您 应仔细分析意外客户的潜在风险 在取消引用输入参数之前的行为。记住存储 进程可以从多个客户端和一些客户端执行 接口执行很少或不检查输入参数值 在它们传递到存储过程之前。
注意:输入参数 在工作区服务器上执行的存储进程不能包含 撇号(')和引号(“)字符。试图 设置这样的输入参数将导致错误。
如果由于某种原因导致宏值不加引号,我建议使用%SUPERQ(myMacroVar)
,以比&myMacroVar
在存储过程服务器外部有一个“测试台”检查存储过程(最简单的解释只是一个宏)可能会让您认为注入是可能的,因为测试台可能不会引用参数服务器也一样。