如何在准备好的语句中跳过变量单引号的形成?

问题描述 投票:-2回答:2

我使用prepared语句在prepared语句中使用以下代码来设置会话变量。

String sessionVariable = "optimizer_search_depth"
String sessionValue = "10";
preparedStatement stmt = connection.prepareStatement("set session ? = ?");
stmt.setString(1, sessionVariable);
stmt.setString(2, sessionValue);
stmt.executeQuery();

如果我使用此即时获取的SQL字符串,如下所示:

> set session 'optimizer_search_depth' = '10';

这将导致sql异常,因为它们周围有一个引号。我需要形成一个不带单引号的查询,例如

> set session optimizer_search_depth = 10;
mysql database connection prepared-statement session-variables
2个回答
0
投票

您需要一些动态SQL。该代码应为:

String sessionVariable = "optimizer_search_depth"
String sessionValue = "10";
preparedStatement stmt = connection.prepareStatement(
  "set session '" + sessionVariable + "' = ?"
  );
stmt.setString(1, sessionValue);
stmt.executeQuery();

请确保sessionVariable受到严格控制,并且它不是来自Web界面等外部来源的自由值。否则,此代码将容易受到SQL注入的攻击。

© www.soinside.com 2019 - 2024. All rights reserved.