java - 确定我的代码是否包含硬编码的 SQL 查询?
问题描述
这是一种验证用户密码的方法。它验证数据库中的用户电子邮件和密码。
public long authenticate(String email, String encodePassword) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try (
Connection conn = DriverManager.getConnection("jdbc:connection", "adminusername","password");/* a) Database User Profile: root is who the user is b) Database user password */
Statement stmt = conn.createStatement();
) /* execute mysql queries */ {
String query = "Select id from User where email = '" + email + "' and password = '" + encodePassword + "'";
System.out.println("query: " + query);
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
// if the user id is there get it
return rs.getLong("id");
}
} catch (SQLException e) {
e.printStackTrace();
}
// if the user id not there return -1 (authority failed)
return -1;
}
为了确定我的演讲是否正确,我在代码中硬编码了 SQL 查询值
解决方案
您的讲师正试图警告您有关 SQL 注入的信息。
SQL 注入是一种网络安全漏洞,允许攻击者干扰应用程序对其数据库的查询。它通常允许攻击者查看他们通常无法检索的数据。这可能包括属于其他用户的数据,或应用程序本身能够访问的任何其他数据。在许多情况下,攻击者可以修改或删除这些数据,从而导致应用程序的内容或行为发生持续变化。
您的代码中的相应部分如下
String query = "Select id from User where email = '" + email + "' and password = '" + encodePassword + "'";
如果查询返回用户的id,则登录成功。否则,它被拒绝。
在这里,攻击者只需使用 SQL 注释序列--
从查询的 WHERE 子句中删除密码检查,即可以任何没有密码的用户身份登录。例如,提交电子邮件 some@email'-- 和空白密码会导致以下查询:
SELECT id FROM users WHERE email = 'some@email'--' AND password = ''
此查询返回电子邮件为 some@email 的用户,并成功以该用户身份登录攻击者,而无需检查密码。
推荐阅读
- python-3.x - Mail Gun 电子邮件在 Google App Engine 上的 Flask 中不起作用
- python - Python 变量没有正确导入
- sql - 当 where 子句只包含索引的第一列时,为什么不使用索引?
- android - Android webview touchmove 错误
- css - 关于应区别对待的同一对象的多个实例的基本 CSS 问题
- linux - 从服务器上的用户运行不受信任的可执行文件的最佳方法
- ios - UICollectionViewController Insets 不能正确调整和滚动
- ansible - 如何将项目作为输入参数循环到 ansible 角色
- html - 如何将全局 int/string 变量集成到我的 ESP8266 网站中?
- ios - SwiftUI TabbedView 仅显示第一个选项卡的内容