Санитарная обработка ввода для SQL-запросов в Adodb для PHP - PullRequest
1 голос
/ 01 ноября 2011

Я оптимизирую платформу, которая использует ADODBforPHP . Я использовал функцию очистки, которая позволяет избежать SQL-инъекций для предыдущих версий PHP (mysql_escape_string), которые, очевидно, больше не поддерживаются и не рекомендуются.

Для тех, кто не использовал библиотеку, она выглядит примерно так:

$rs = $cnn->Execute('SELECT * FROM user WHERE id_user='.q($_GET['id']));

Пример обновления какой-либо строки:

$record = array();
$record['name'] = q($_GET['name']);
$record['last_update'] = time();
$rsProfile = $cnn->Execute('SELECT * FROM user WHERE id_user='.q($_GET['id']));
$sql = $cnn->GetUpdateSQL($rsProfile,$record);
if($sql) $cnn->Execute($sql);                            

В этом случае q ($ string) - это функция очистки, которую я пытаюсь улучшить. У меня нет доступа для установки PDO на этом сервере, так что это не вариант.

Текущий q () использует mysql_real_escape_string без 2-го аргумента:

function q($data) {
    if(!empty($data) && is_string($data)) {
        $data = str_replace(array('\\', "\0", "\n", "\r", "'", '"', "\x1a"), array('\\\\', '\\0', '\\n', '\\r', "\\'", '\\"', '\\Z'), $data);
        $data = "'".$data."'";
    }
    return $data;
}

Кто-то рекомендовал filter_var ($ value, FILTER_SANITIZE_STRING) на другом форуме, но я, честно говоря, не использовал это для этих вопросов.

Есть ли какие-либо рекомендации по повышению безопасности использования этой функции?

Обновление 1

function q($data) {
    if(is_string($data)) {
        return "'".mysql_real_escape_string($data)."'";
    } elseif(is_numeric($data) || is_bool($data)) {
        return $data;
    } else {
        return "''";
    }
}

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

Прошу прощения за то, что разочаровал вас, но ваша функция очистки, независимо от того, что она делает , ничего не "санирует", и вы можете сделать инъекцию в самом коде, который вы разместили здесь.
просто назови свой сценарий так * 1004

code.php?id=1 union select password from users where id=1

и посмотрите, что этот код "санировал" что-либо.

Какие-либо рекомендации о том, как повысить безопасность цели этой функции?

Конечно.
Прежде всего вы должны понять, что такое экранирование и как его использовать.

Тогда вы должны начать использовать заполнители , я полагаю

0 голосов
/ 01 ноября 2011

Из документации из mysql_escape_string:

Эта функция устарела, не используйте эту функцию. Вместо этого используйте mysql_real_escape_string ().

Итак, если вы используете mysql, у вас должно быть все в порядке с mysql_real_escape_string.

...