在JavaFX桌面应用程序中是否有任何方法可以避免SQL注入和其他安全性故障?如果是,我该怎么做?
答案 0 :(得分:0)
SQL Injection攻击与最终用户故意发送到数据库的恶意语句有关,而JavaFX则是从用户的角度来看的前端。
那就是说,让我们假设你有一个登录界面来输入用户名和密码。你可以阻止用户输入以下句子之一而不是真正的用户名吗?
DROP TABLE Users; --or
DELETE FROM Users WHERE 1=1;
您可以验证文字,查找某些关键字,例如DROP
,INSERT
,UPDATE
或DELETE
。但值得吗?也许确实如此,取决于用户可能会尝试继续进行此类攻击。
然而,缓解和阻止SQL注入的最佳方法是从连接本身开始。简而言之,您希望与具有较少必要操作权限的用户连接到数据库。通常的做法是创建一个专用用户来执行登录,例如,对Users
表具有只读访问权限,并且可能INSERT
和UPDATE
授予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(),使其更安全。