这可能是一个非常愚蠢的问题,但我想为什么不......
我正在使用带有实体框架的RIA服务作为后端。我在我的应用程序中有一些地方接受用户输入,并直接使用他们的数据询问RIA服务(反过来EF和我的数据库)问题。这些层中的任何一个都有助于防止出现安全问题,还是应该自己擦除数据?
例如,每当新用户向应用注册时,我都会调用此方法:
[Query]
public IEnumerable<EmailVerificationResult> VerifyUserWithEmailToken(string token)
{
using (UserService userService = new UserService())
{
// token came straight from the user, am I in trouble here passing it directly into
// my DomainService, should I verify the data here (or in UserService)?
User user = userService.GetUserByEmailVerificationToken(token);
...
}
}
(我是否应该推出自己的用户验证系统是另一个问题,我们正在采用MS的会员框架。我对sql注入和RIA服务更感兴趣)
答案 0 :(得分:3)
sql注入基于生成原始sql字符串时使用的非转义字符串
例如
"SELECT * FROM `user` WHERE `name` = '" . $name . "'"
易受攻击,因为$name
的值可能包含'标记,因此修改了sql语句的含义。一个很好的例子是,如果$ name为' OR 1=1; --
,那么就进行sql查询:
"SELECT * FROM `user` WHERE `name` = '' OR 1=1; --'"
这对于绕过密码检查非常有用我可以告诉你:)
正确的解决方法是将'字符转义为'(对于mysql)。这就是php等语言提供mysql_real_escape_string
的原因。但是,如果你使用一个适当的参数化查询系统,那么你可以通过你喜欢的任何东西,库将正确地转义它。
查看你的代码,没有理由检查token
的值,除非你的UserService做了一些狡猾的sql字符串生成(并且我确定实体框架没有这样做,所以你应该没问题)
答案 1 :(得分:3)
EF将为您进行参数化,但是如果您确实要确保启动SQL Profiler
并查看发送到SQL Server的内容
答案 2 :(得分:2)
你应该是安全的,我确信EF正在生成参数化查询以从数据库中检索数据。