如何避免 JavaFX 桌面应用程序中的 SQL 注入和其他安全故障
How to avoid SQL injection and other security failure in JavaFX desktop application
有什么方法可以避免 SQL JavaFX 桌面应用程序中的注入和其他安全故障?如果可以,我该怎么做?
SQL Injection攻击与最终用户故意向数据库发送恶意语句有关,而JavaFX从用户的角度来看是前端。
也就是说,假设您有一个登录屏幕来输入用户名和密码。你能阻止用户键入以下句子之一而不是他们的真实用户名吗?
DROP TABLE Users; --or
DELETE FROM Users WHERE 1=1;
您可以验证文本以查找某些关键字,如 DROP
、INSERT
、UPDATE
或 DELETE
。但它值得吗?也许会,这取决于用户尝试进行此类攻击的可能性有多大。
然而,减轻和阻挠 SQL 注入的最佳方法是从连接本身开始。通常,您会希望与具有较少必要权限的用户连接到数据库。通常的做法是创建一个专门的用户来进行登录,例如,只读访问 Users
table 并且可能 INSERT
和 UPDATE
授予 Sessions
table(当然,如果你有兴趣保留会话日志):
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。
在这种情况下,如果最终用户成功将上述语句之一发送到数据库,建立连接的数据库用户将没有足够的权限来执行这些语句的 none,并且导致 SQL 异常。这同样适用于其他实体,只需为数据库用户提供较少的权限来处理敏感数据。
此外,JDBC提供了PreparedStatement接口,旨在通过使用占位符构建语句来避免SQL注入。例如:
String sql = "SELECT * FROM Users WHERE username = ?";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, userName);
userName
参数在将语句发送到数据库之前将被包装成文字,因此如果用户键入上述恶意语句之一,它们将不会产生任何影响。另外,如果你想执行一个以上的句子,你必须使用 addBatch() and executeBatch(),这是在开发者的控制下,使它更安全。
有什么方法可以避免 SQL JavaFX 桌面应用程序中的注入和其他安全故障?如果可以,我该怎么做?
SQL Injection攻击与最终用户故意向数据库发送恶意语句有关,而JavaFX从用户的角度来看是前端。
也就是说,假设您有一个登录屏幕来输入用户名和密码。你能阻止用户键入以下句子之一而不是他们的真实用户名吗?
DROP TABLE Users; --or
DELETE FROM Users WHERE 1=1;
您可以验证文本以查找某些关键字,如 DROP
、INSERT
、UPDATE
或 DELETE
。但它值得吗?也许会,这取决于用户尝试进行此类攻击的可能性有多大。
然而,减轻和阻挠 SQL 注入的最佳方法是从连接本身开始。通常,您会希望与具有较少必要权限的用户连接到数据库。通常的做法是创建一个专门的用户来进行登录,例如,只读访问 Users
table 并且可能 INSERT
和 UPDATE
授予 Sessions
table(当然,如果你有兴趣保留会话日志):
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。
在这种情况下,如果最终用户成功将上述语句之一发送到数据库,建立连接的数据库用户将没有足够的权限来执行这些语句的 none,并且导致 SQL 异常。这同样适用于其他实体,只需为数据库用户提供较少的权限来处理敏感数据。
此外,JDBC提供了PreparedStatement接口,旨在通过使用占位符构建语句来避免SQL注入。例如:
String sql = "SELECT * FROM Users WHERE username = ?";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, userName);
userName
参数在将语句发送到数据库之前将被包装成文字,因此如果用户键入上述恶意语句之一,它们将不会产生任何影响。另外,如果你想执行一个以上的句子,你必须使用 addBatch() and executeBatch(),这是在开发者的控制下,使它更安全。