JAVA - 可能 SQL 注入
JAVA - Possible SQL Injection
所以我有这段代码:
String username = props.getProperty("jdbc.username");
try {
String username = parts[1];
// Check procedure
System.out.println("Checking user");
// Check database user table for username
conn = getSQLConnection();
Statement stat = conn.createStatement();
ResultSet user = stat.executeQuery( "SELECT * FROM USER WHERE log_id='" + username + "';" );
// Check given password against user entry
if(user.next()){
System.out.println("User Exists: " + username);
sendMessage("true");
return;
}
else{
System.out.println("User Does Not Exist: " + username);
sendMessage("false user");
return;
}
出于教育目的,即使我知道输入的来源,SQL 语句是否受到保护免受 SQL 注入?
ResultSet user = stat.executeQuery( "SELECT * FROM USER WHERE log_id='" + username + "';" );
这需要SQL注入。
想象一下如果 username
有这个值会发生什么:
John'; delete from user where 'a' = 'a
是的,一大堆 Java JDBC SQL 教程都弄错了。基本上,总是使用 PreparedStatement
s.
不仅因为这使得即使 username
具有上述恶意值也可以安全使用,而且更重要的是,因为 RDBMS 引擎可以将相同的查询重复用于所有进一步的调用.
简而言之,没有理由不使用它们。演示 SQL 使用字符串连接的教程应该会痛苦地死去,SQL 注入死亡。
如 this post 中所述,一名流氓攻击者可以对您的应用程序执行以下操作:
- 调用休眠函数,使您的所有数据库连接都处于繁忙状态,从而使您的应用程序不可用
- 正在从数据库中提取敏感数据
- bypassing the user authentication
并且不仅仅是 SQL 会受到影响。如果您不使用绑定参数,甚至 JPQL 也可能受到威胁。
最重要的是,在构建 SQL 语句时切勿使用字符串连接。为此目的使用专用的 API:
所以我有这段代码:
String username = props.getProperty("jdbc.username");
try {
String username = parts[1];
// Check procedure
System.out.println("Checking user");
// Check database user table for username
conn = getSQLConnection();
Statement stat = conn.createStatement();
ResultSet user = stat.executeQuery( "SELECT * FROM USER WHERE log_id='" + username + "';" );
// Check given password against user entry
if(user.next()){
System.out.println("User Exists: " + username);
sendMessage("true");
return;
}
else{
System.out.println("User Does Not Exist: " + username);
sendMessage("false user");
return;
}
出于教育目的,即使我知道输入的来源,SQL 语句是否受到保护免受 SQL 注入?
ResultSet user = stat.executeQuery( "SELECT * FROM USER WHERE log_id='" + username + "';" );
这需要SQL注入。
想象一下如果 username
有这个值会发生什么:
John'; delete from user where 'a' = 'a
是的,一大堆 Java JDBC SQL 教程都弄错了。基本上,总是使用 PreparedStatement
s.
不仅因为这使得即使 username
具有上述恶意值也可以安全使用,而且更重要的是,因为 RDBMS 引擎可以将相同的查询重复用于所有进一步的调用.
简而言之,没有理由不使用它们。演示 SQL 使用字符串连接的教程应该会痛苦地死去,SQL 注入死亡。
如 this post 中所述,一名流氓攻击者可以对您的应用程序执行以下操作:
- 调用休眠函数,使您的所有数据库连接都处于繁忙状态,从而使您的应用程序不可用
- 正在从数据库中提取敏感数据
- bypassing the user authentication
并且不仅仅是 SQL 会受到影响。如果您不使用绑定参数,甚至 JPQL 也可能受到威胁。
最重要的是,在构建 SQL 语句时切勿使用字符串连接。为此目的使用专用的 API: