我有一个Java应用程序,它使用在UI中键入的sql查询执行POST,并使用JDBC执行。由于查询是用户定义的,我无法找到防止SQL注入问题的方法。例如,如果这是用户发出的查询:
select * from test_table where id=123
使用此字符串对servlet执行POST,并将其作为查询执行。无论如何都要解决这个问题,因为用户可以发送什么内容没有限制?
由于
答案 0 :(得分:1)
从技术上讲,如果允许用户编写整个查询,那么这不是注入攻击风险,只是攻击风险
使用数据库用户运行查询,该用户只有在您愿意授予访问权限的表上执行您认为可接受的操作类型的权限。
例如,只允许在tableX,tableY和tableZ上使用SELECT。没有DML,没有DDL,也没有从任何其他表中选择
如果您选择的dbms不允许以这种方式进行细粒度控制,则执行一个常规批处理脚本,创建另一个只包含几个表的数据库。允许您的用户查询此新数据库。如果它确实被破坏了,它很快就会被删除,并被脚本替换为具有更新数据的工作。如果放在另一台服务器上,这也是有益的,它可以阻止您的实时系统被执行占用服务器上所有资源的duff查询无辜地进行DOS操作
答案 1 :(得分:0)
SQL注入将传递toString
来代替参数。
不确定您要让应用程序使用哪些信息,但我建议仅授予对特定架构的访问权限。这将提供一致的安全模型。
答案 2 :(得分:0)
正如其他人所说,这不是SQL注入 - 我称之为“设计中”SQL注入。你如何处理它取决于用例:
通过验证来限制SQL语句是不现实的 - 它是一种强大的语言,尤其是在现代数据库的上下文中。
答案 3 :(得分:0)
有没有办法解决这个问题,因为用户可以发送什么内容没有限制?
我不确定你的意思是“四处走动”。允许用户运行任何查询是否不是此应用程序的设计?
如果您想阻止它们运行未经授权的查询,那么您必须在servlet中实现一些Java代码来检查查询并确定它是否是他们有权运行的查询。
有些人通过将一组特定的已知查询列入白名单来实现此目的。只需将用户的输入查询与白名单进行匹配。
如果他们可以使用各种不同的常量值运行给定查询,则在白名单表单和用户输入SQL查询的副本中用?
替换常量值。
如果他们可以运行各种不同的查询,比如使用可选的子句和东西,那么就不可能制作有限长度的白名单,那么你将不得不在Java servlet中实现一个SQL解析器业务规则引擎,在您针对真实数据库运行查询之前,确定其查询是否已获得授权。
此时,更改应用程序前端似乎更容易,因此不允许用户提交任意SQL查询!