2017-10-11 125 views
0

我有一个Java应用程序,它使用在UI中键入并使用JDBC执行的sql查询执行POST。由于查询是用户定义的,我无法找到防止SQL注入问题的方法。举例来说,如果这是查询的用户的问题:如何防止从UI中传入SQL查询时发生SQL注入攻击

select * from test_table where id=123 

一个POST与此字符串给servlet完成,这是作为一个执行查询。反正有没有办法解决这个问题,因为用户可以发送的内容没有限制?

感谢

+3

倒不如这样用户就不必在输入查询来设计应用程序。 –

+0

你可以有这样的用户使用的应用程序的用户ID W /只选择访问。到数据库。这种方式,如果有什么,但选择尝试失败。应用程序的其余部分可以具有插入/更新/删除权限;但是这部分用户的连接是只读的;但是这并不能阻止他们阅读他们选择的表格。 – xQbert

+0

大声笑这并没有真正的资格作为SQL注入攻击......你将与SQL注入作为一种操作方式。这里的安全=信任你的用户。 – Twelfth

回答

1

从技术上讲,如果用户被允许写整个查询,它不是一个注入攻击的危险,它只是一个攻击风险

运行使用具有权限的数据库用户只能携带查询在您愿意访问的表格上列出您认为可接受的操作类型。

例如,只允许对tableX,tableY和tableZ执行SELECT操作。没有DML,没有DDL,也没有从其他表中选择

如果您选择的dbms不允许以这种方式进行细粒度控制,那么请改为执行常规批处理脚本,以创建另一个只包含少量表的数据库。允许你的用户查询这个新的数据库。如果它遭到破坏,它很快就会被脚本丢弃,并被更新后的数据替代。如果放置在另一台服务器上,这样做也是有益的,它可以阻止用户执行duff查询来禁止实时系统进行DOS操作,该查询会占用服务器上的所有资源。

+0

深化对什么@Caius Jard说,根据不同的DBMS,你可以限制访问特定的模式,存储过程和视图,在其中您可以访问权限授予有限制字段中的某些对象,你可能不希望用户是能够查询(社会安全号码,信用卡信息等) – kchason

0

SQL注入将通过select * from test_table where id=123代替参数。

不确定您要让应用程序使用哪些信息,但我建议仅授予对特定模式的访问权限。这将提供一致的安全模型。

0

正如其他人所说,这不是SQL注入 - 我称之为“设计”SQL注入。你如何处理与这取决于使用情况:

  • 设计一个单独的接口,不需要完整的SQL语句
  • 作为凯斯建议,如果你能在DB帐户限制PRIVS只做什么用户可以这样做,这会限制损坏
  • 如果这是一个管理界面,您可能希望将此界面的使用限制为“可信”用户。如果你走这条路线,你要非常小心地记录具有这个权限的用户可以完全访问数据库,并提供一个审计机制来确保这个用户列表是众所周知的。

通过验证来限制SQ​​L语句是不切实际的 - 它是一种强大的语言,特别是在现代数据库的情况下。

参见this related question

0

反正是有解决这个问题,因为没有什么用户可以发送没有限制?

我不确定您的意思是“绕过”。“是否这个应用程序的设计允许用户运行任何查询?

如果你想阻止他们运行未经授权的查询,那么你必须在servlet中实现一些Java代码来检查查询和决定它是否是一个他们有权运行。

有些人这样做是通过白名单一组特定的已知的查询,只要对阵白名单用户的输入查询。

如果他们可以运行一个给定的查询各种不同的恒定值,然后在这两个列入白名单的形式,并在用户输入的SQL查询的副本?替换常数值。

如果他们能够运行多种不同的查询,如与可选条款之类的东西,所以它不可能让有限长度的白名单,那么你就必须在你的Java servlet和某种实现SQL语法分析器的业务规则引擎来确定他们的查询是否被授权,然后才能在真实数据库上运行它。

此时,更改应用程序前端似乎更容易,以免用户提交任意SQL查询!