对于我们ASP.NET(针对SQL Server)应用程序内的一些功能,我们允许员工用户指定WHERE子句。这个WHERE子句然后被添加到系统生成的SELECT语句的代码中以检索一些数据。保护数据输入SQL以防止不良行为
所以在本质上,我们结束了:
SELECT SomeFields FROM SomeTable WHEREUserEnteredWhere
其中大胆是系统和斜体是用户。这已经工作了一段时间,并给了我们一些很好的灵活性。
然而显然还有这里一个很大的问题,如果用户输入,其中:
SomeField = 1; DROP TABLE SomeTable;
目前唯一的验证语句是否与SELECT开始,将通过,因为我们将结束:
SELECT SomeFields FROM SomeTable WHERESomeField = 1; DROP TABLE SomeTable;
长期的解决办法是不允许用户输入SQL到文本框,但在短期内我要撑住这件事。
我能想到的唯一解决方案是在交易中运行每个请求以确保不会造成长期损害。
有没有人对我如何验证用户输入的“where子句”有任何建议,以确保它在执行之前没有任何DDL内容?
PS。我意识到上述情况很糟糕,不应该这样做,但这是我在遗留系统中所做的(我没有写过),所以请尽量帮助我解决问题,而不是告诉我不要这样做。 :-)
限制接入是另一种方式。如果用户没有权限放弃,他不会放弃它。希望有人会添加更多的细节。 –
我认为保存的方法是验证任何输入的单词,并检查输入的单词是否包含任何错误的动作命令,然后再将它传递到SQL查询中。 – Saif
你如何“我们允许员工指定WHERE子句”?如果您允许用户传递一个键/值对列表,然后自己构造查询,该怎么办? asp.net服务帐户仍然有权限(另一个安全轴,您可以像别人提到的那样修复),最终用户实际上并不需要直接访问,是吗? – Tipx