官网地址:(点击最下方【阅读原文】可直达)https://tca.tencent.com/
官网介绍:https://cloud.tencent.com/product/tcap 官方开源:https://github.com/Tencent/CodeAnalysis 国内镜像:https://git.code.tencent.com/Tencent_Open_Source/CodeAnalysis
▼
SQL注入漏洞是一种常见的Web应用程序安全漏洞,攻击者可以通过构造特殊的输入,将恶意的SQL代码注入到Web应用程序中,从而导致数据泄露、篡改或删除等安全问题。
下列案例对应代码分析TCA-Armory-L工具中的规则:sqli——检测代码中可能存在的SQL注入漏洞,并提供警告或建议修复的信息。
▼
代码案例
protected AttackResult injectableQuery(String accountName) {
String query = "";
try (Connection connection = dataSource.getConnection()) {
query = "SELECT * FROM user_data WHERE first_name = 'John' and last_name = '" + accountName + "'";
try (Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE)) {
ResultSet results = statement.executeQuery(query);
// Do something...
}
}
}
这段代码存在SQL注入漏洞。漏洞的原因是在构造SQL查询语句时,直接将用户输入的accountName拼接到SQL语句中,没有进行任何验证或过滤。攻击者可以通过构造特殊的accountName值,将恶意的SQL代码注入到查询语句中,从而导致数据泄露、篡改或删除等安全问题。
例如,如果攻击者将accountName设置为Doe' OR '1' = '1,那么构造的SQL查询语句将变为:
SELECT * FROM user_data WHERE first_name = 'John' and last_name = 'Doe' OR '1' = '1'
这个查询语句将返回user_data表中所有的记录,因为'1' = '1'总是为真。这显然是不符合预期的行为,可能导致数据泄露。
AI修复建议
protected AttackResult injectableQuery(String accountName) {
String query = "SELECT * FROM accounts WHERE account_name = ?";
try (Connection connection = dataSource.getConnection()) {
PreparedStatement preparedStatement = connection.prepareStatement(query);
preparedStatement.setString(1, accountName);
ResultSet results = preparedStatement.executeQuery();
if ((results != null) && (results.first())) {
ResultSetMetaData resultsMetaData = results.getMetaData();
StringBuilder output = new StringBuilder();
// ... 其他代码
}
} catch (SQLException e) {
// 异常处理
}
// 返回结果或其他操作
}
▼
进入页面,点击方案->规则配置 -> 自定义规则包-> 添加规则 ->搜索规则名sqli->选择需要添加的规则 ->批量添加规则
可以直接选择添加对应语言的 强化安全规则包
关注我们,
持续为您的代码助力!