我正在创建一个Java桌面应用程序,用于在数据库上生成和存储用户密码。
我的问题是: 在应用程序中实施SQL查询的最安全方式是什么?
在源代码中进行查询肯定是不安全的。我的工作是在本地存储db文件,但我更愿意将数据存储在外部服务器上。
那么如何在没有嵌入源代码的情况下在swing应用程序中实现SQL查询。
答案 0 :(得分:2)
在源代码中进行查询肯定是不安全的。
我从未见过敏感的SQL 查询。通常,您接受来自用户的敏感数据(例如,密码输入到Swing字段中)并使用此数据填充现有的参数化查询,例如
UPDATE users SET password=? WHERE username=?
答案 1 :(得分:0)
我不知道如何在不实现的情况下在应用程序中执行某些操作。我只是不明白你的方法。您可能想要注册新用户或其他东西,并且您不想以任何方式透露您的数据库结构,我是对的吗?你不能做那样的事情来直接操作DB(通过sql)而不是将它编码到app中。
<强>解决方案强>: 根据您的需求创建专用的REST API。所有数据库操作处理都在服务器端(哈,你需要服务器 - 可以是php的简单apache托管)所以没有数据库结构的启示等等。你需要做的就是用适当的数据向服务器发送命令 - 用户名和密码。为了最大限度地提高安全性,您应该使用SSL来与API进行通信。
谢谢。
答案 2 :(得分:0)
无需保护查询文本。您可能对记录查询使用的参数感到担忧。如果将原始密码存储在数据库中,则存在问题。所以我建议不要先存储raw passwords。
我会详细说明如何将SQL嵌入到Java代码中。如果应用程序使用数据库,则需要调用数据库,这意味着执行SQL语句。避免这种情况的唯一方法是将此工作委托给另一个应用程序,以便您的应用程序不使用SQL,而是使用某些自定义协议/ API,该应用程序将代表它执行SQL查询。
您可以将SQL与Java代码分开存储,但这不是出于安全考虑,而主要是因为需要更准确地构建应用程序。这就是不将SQL嵌入Java代码的主要驱动力是代码可读性,性能,维护和代码重用。
在访问数据库时使用ORM是一种常见做法。在这种情况下,您的应用程序根本没有SQL代码,而是通过ORM API访问数据库并不罕见。例如,在休眠中,查询可能看起来像
User user = session.createCriteria(User.class)
.add( Restrictions.eq("name", userName) )
.uniqueResult();
即使您需要执行一些不受您选择的ORM直接支持的SQL查询,SQL文本本身通常也会存储在一些附带的xml文件中。
请注意,在后一种情况下,尽管技术上SQL没有嵌入到Java代码中,但它仍然驻留在您的一个应用程序包中。