如何从 HANA 占位符中逃脱 sql 注入

How to escape sql injection from HANA placeholder

我有一些使用 PLACEHOLDER 输入的 HANA 查询,当然我想防止 sql 注入。

我尝试在odbc_prepare()

中使用?
$query = <<<SQL
SELECT
    col,
    ...
FROM table_name('PLACEHOLDER'=('$$some_key$$', ?))
WHERE col = ?
SQL;
$stmt = \odbc_prepare($conn, $query);

if ($stmt !== false) {
    \odbc_execute($stmt, ['placeholder_value', 'where_value']);
}

但我收到此警告:

Warning: odbc_prepare(): SQL error: [SAP AG][LIBODBCHDB SO][HDBODBC] Syntax error or access violation;257 sql syntax error: incorrect syntax near &quot;?&quot;: line 32 col 40 (at pos 1283), SQL state 37000 in SQLPrepare

并且未创建语句。所以我的代码现在看起来像这样:

$query = <<<SQL
SELECT
    col,
    ...
FROM table_name('PLACEHOLDER'=('$$some_key$$', 'placeholder_value'))
WHERE col = ?
SQL;
$stmt = \odbc_prepare($conn, $query);

if ($stmt !== false) {
    \odbc_execute($stmt, ['where_value']);
}

据我所知,here htmlspecialchars() 不足以阻止 SQL 注入。

我无法remove输入占位符,我没有 HANA。

有没有其他方法可以防止 SQL 在 PLACEHOLDER 中注入?

您在此处使用的(旧)占位符语法 ('PLACEHOLDER'=('<varname>', '<var value>')) 不允许绑定变量。

相反,新的占位符语法 (PLACEHOLDER."<varname>"=>?) 允许使用绑定变量。

在您的代码中,它看起来像这样:

$query = <<<SQL
SELECT
    col,
    ...
FROM table_name (PLACEHOLDER."$$some_key$$" => ?)
WHERE col = ?
SQL;
$stmt = \odbc_prepare($conn, $query);