如何从 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 "?": 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);
我有一些使用 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 "?": 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);