java - 我们可以替换Java中字符串中开头和结尾都有符号的部分来识别吗?
问题描述
我有一个字符串 SELECT *FROM USERS WHERE ID = '@userid@' AND ROLE = '@role@'
现在我已经用实际值替换了 @...@ 之间的任何字符串。
预期产出SELECT *FROM USERS WHERE ID = '4' AND ROLE = 'Admin'
这个替换将通过一个方法发生,我已经写了这个逻辑
public String replaceQueryKeyWithValueFromKeyValues(String query, int reportId) {
try {
REPMReportDao repmReportDao = new REPMReportDao();
int Start = 0;
int end;
if (query.contains("@")) {
boolean specialSymbolFound = false;
for (int i = 0; i < query.length(); i++) {
if (query.charAt(i) == '@') {
if (!specialSymbolFound) {
Start = i + 1;
specialSymbolFound = true;
} else {
specialSymbolFound = false;
end = i;
query = query.replace(query.substring(Start - 1, end + 1), repmReportDao.getReportManagerKeyValue(query.substring(Start - 1, end + 1).replaceAll("@", ""), reportId));
}
}
}
return query;
} else {
return query;
}
} catch (Exception e) {
logger.log(Priority.ERROR, e.getMessage());
return e.getMessage();
}
}
它工作正常,但如果存在单个“@”符号而不是开始和结束,它将失败。喜欢 :
SELECT *FROM USERS WHERE emailid = 'xyz@gmail.com' AND ROLE = '@role@'
在这里,它应该替换唯一的角色“@role@”,并且应该保留电子邮件原样。
预期输出 =>SELECT *FROM USERS WHERE emailid = 'xyz@gmail.com' AND ROLE = 'Admin'
解决方案
使用字符串替换来生成数据库查询被认为是非常糟糕的做法,因为您的代码容易受到 SQL 注入攻击。我无法从您提供的小代码示例中看出,但绝大多数大型 Java 项目都使用Spring Framework,它允许您使用JdbcTemplate或(我的偏好)NamedParameterJdbcTemplate。两者都允许您以安全的方式替换变量。
推荐阅读
- go - 坚持单一价值 Kubernetes 和 Golang
- xml - 如何在 Mulesoft 中遍历 xml 文件
- amazon-web-services - 在 AWS 上为公共流量启用更多端口?Nginx/Docker 多应用设置
- python - 如何使用抽搐API?
- javascript - 错误“未捕获的类型错误:this.containerDim 未定义”当我打开超过 1 个选项卡使用 firefox 时,它在我使用 chrome 时工作正常
- solr - SOLR同时搜索多个动态字段_b布尔字段
- git - 如何在 bash 或 Jenkins 管道中安全地添加凭据来 git pull
- sql - 使用另一个表从一个表中选择内容
- python-3.x - 我从 python 2.7 迁移到 3.8.5,现在我的代码将无法运行。我正在显示 UnboundLocalError: local variable 'Url_name' referenced before assignment
- reactjs - Next.js 将 old-url 重定向到 new-url next.config 问题