Как избежать инъекции sql из заполнителя HANA - PullRequest
0 голосов
/ 21 октября 2019

У меня есть несколько запросов HANA, использующих ввод PLACEHOLDER, и, конечно, я хочу предотвратить внедрение 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']);
}

Как я вижу, здесь htmlspecialchars() недостаточно для предотвращения SQL-инъекций.

Я не могу удалить заполнитель ввода, у меня нет HANA.

Есть ли другой способ предотвратить внедрение SQL в PLACEHOLDER?

1 Ответ

1 голос
/ 22 октября 2019

Используемый здесь (старый) синтаксис заполнителя ('PLACEHOLDER'=('<varname>', '<var value>')) не позволяет связывать переменные.

Вместо этого новый синтаксис заполнителя (PLACEHOLDER."<varname>"=>?) позволяет использовать переменные связывания.

В вашем коде это будет выглядеть так:

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