如何避免JavaFX桌面应用程序中的SQL注入和其他安全性故障

时间:2015-01-23 12:30:17

标签: sql javafx sql-injection

在JavaFX桌面应用程序中是否有任何方法可以避免SQL注入和其他安全性故障?如果是,我该怎么做?

1 个答案:

答案 0 :(得分:0)

SQL Injection攻击与最终用户故意发送到数据库的恶意语句有关,而JavaFX则是从用户的角度来看的前端。

那就是说,让我们假设你有一个登录界面来输入用户名和密码。你可以阻止用户输入以下句子之一而不是真正的用户名吗?

DROP TABLE Users; --or
DELETE FROM Users WHERE 1=1;

您可以验证文字,查找某些关键字,例如DROPINSERTUPDATEDELETE。但值得吗?也许确实如此,取决于用户可能会尝试继续进行此类攻击。

然而,缓解和阻止SQL注入的最佳方法是从连接本身开始。简而言之,您希望与具有较少必要操作权限的用户连接到数据库。通常的做法是创建一个专用用户来执行登录,例如,对Users表具有只读访问权限,并且可能INSERTUPDATE授予Sessions表(如果您有兴趣保留会话日志):

CREATE USER 'login_user'@'%' IDENTIFIED BY 'password';
GRANT USAGE ON MyDataBase.* TO 'login_user'@'%';
GRANT SELECT ON Users TO 'login_user'@'%';
GRANT INSERT, UPDATE ON Sessions TO 'login_user'@'%';

注意: 该代码段基于MySQL,但同样的概念也适用于其他RDBMS。

在这种情况下,如果最终用户成功将上述句子中的一个发送到数据库,那么建立连接的db用户将不会。有足够的权限不执行这些句子,并将导致SQL异常。这同样适用于其他实体,只是为db用户提供使用敏感数据操作的特权较少。

此外,JDBC提供了PreparedStatement接口,旨在通过使用占位符来构建语句来避免SQL注入。例如:

String sql = "SELECT * FROM Users WHERE username = ?";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, userName);

在将语句发送到数据库之前,userName参数将被包装到文字中,因此如果用户键入上述恶意句子中的一个,则它们将不会产生任何影响。另外,如果您要执行多个句子,则必须使用受开发人员控制的addBatch()executeBatch(),使其更安全。