backtick preparedStatement Java
我对要发送到MySQL服务器的以下语句有困难:backtick preparedStatement Java,java,mysql,jdbc,backticks,Java,Mysql,Jdbc,Backticks,我对要发送到MySQL服务器的以下语句有困难: UPDATE abonament SET ? = '1' WHERE abonutid = ? 我将其替换为: ps.setString(1, "`" + (indexLunaPlatita + 1) + "`"); ps.setInt(2, selVal); 但当我运行该程序时,我将其输入MySQL: ''`24`' = '1' WHERE abonutid = 2' 因此,它会自动用“”包围反勾选的表达式 需要帮忙吗 谢谢大家! 不能对列
UPDATE abonament SET ? = '1' WHERE abonutid = ?
我将其替换为:
ps.setString(1, "`" + (indexLunaPlatita + 1) + "`");
ps.setInt(2, selVal);
但当我运行该程序时,我将其输入MySQL:
''`24`' = '1' WHERE abonutid = 2'
因此,它会自动用“”包围反勾选的表达式
需要帮忙吗
谢谢大家! 不能对列名使用占位符(
?
),只能对值使用占位符。这是一条一般规则(不限于MySQL)
如果需要根据用户输入确定列名,请非常小心-您必须自己清理输入以避免SQL注入攻击,在这种情况下JDBC无法帮助您防止攻击
?
不适用于您的案例的原因是,这些参数化查询是使用准备好的语句实现的:
- 语句被发送到数据库,进行解析、编译和可能的优化,此时不知道值
- (准备好的语句的主要用例是通过重用已编译语句来提高性能)
- 然后在第二步中提供这些值,指示数据库使用这些值执行语句
- 然后可以发送另一组值来执行准备好的语句,例如
由于值直到第二步才被发送,因此它们不能用于确定语句真正的功能(例如,它使用的表或列)。您不能对列名使用占位符(
?
),而只能对值使用占位符。这是一条一般规则(不限于MySQL)
如果需要根据用户输入确定列名,请非常小心-您必须自己清理输入以避免SQL注入攻击,在这种情况下JDBC无法帮助您防止攻击
?
不适用于您的案例的原因是,这些参数化查询是使用准备好的语句实现的:
- 语句被发送到数据库,进行解析、编译和可能的优化,此时不知道值
- (准备好的语句的主要用例是通过重用已编译语句来提高性能)
- 然后在第二步中提供这些值,指示数据库使用这些值执行语句
- 然后可以发送另一组值来执行准备好的语句,例如
由于值直到第二步才被发送,因此它们不能用于确定语句真正的功能(例如,它使用的表或列)。不要使用setString,只需将它们与query@YCF_L不要连接查询,这就导致了SQL注入。你不能使用
?
占位符作为列名(或表名)。@dragonThinks我同意,但没有办法使用setString我已经回答了这里的某个人OP可以在他/她将列名与queryin常规准备语句连接之前检查列名,无论你的编程语言是什么,不需要你添加标点符号,他们正在做比字符串替换更复杂的事情。它们引入值。不要使用setString,只需将它们与query@YCF_L不要连接查询,这会导致SQL注入。列名(或表名)不能使用?
占位符@DragonThinks我同意,但没有办法使用setString我已经回答了这里的某个人OP可以在他/她将列名与查询连接之前检查列名在通用准备语句中,无论您的编程语言如何,都不需要您添加标点符号,他们正在做比字符串替换更复杂的事情。它们引入了价值观。