Является ли умножение на 1 безопасным способом очистки числовых значений от SQL-инъекций? - PullRequest
4 голосов
/ 12 ноября 2011

Мне интересно, если у меня есть значение, которое, как я знаю, должно быть числовым, умножает ли его на 1 безопасный метод очистки?

function x($p1){
   $p1*=1;
   sql="select * from t where id ={$p1}";
   //run query..
}

Хотя в моем примере используется идентификатор, он используется для многих типов числовых значений, которые есть в моем приложении (могут быть деньги, могут быть пай и т. Д.)

Ответы [ 6 ]

2 голосов
/ 12 ноября 2011

Вы можете использовать is_numeric ()

2 голосов
/ 12 ноября 2011

Не понимаю, почему этого не будет. Но что не так с использованием подготовленных заявлений? Это всегда будет безопаснее, чем использование переменных PHP непосредственно в операторах SQL.

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

В большинстве случаев это работает, поскольку приводит к приведению строк к целым или двойным числам, но вы должны быть осторожны.Это будет работать правильно для скалярных значений.Однако, если вы сделаете это:

x(new stdClass);

Вы получите E_NOTICE.Это не так плохо, правда?Это:

x(array());

И вы получите E_ERROR, Неподдерживаемые типы операндов , и скрипт завершится.

Возможно, вы подумаете, что это не так уж и плохо, но фатальная ошибка в неподходящий момент может привести к нестабильному состоянию вашей системы, например, из-за потери ссылочной целостности или из-за того, что ряд запросов не будет завершен.

Только вы знаете, может ли случиться случай, подобный описанному выше.Но если эти данные каким-либо образом получены от пользователя, я бы согласился с Законом Мерфи и не доверял бы ему.

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

Хотя это, вероятно, сработает, intval кажется лучшим решением. http://php.net/manual/en/function.intval.php. Ваши намерения, скорее всего, будут более очевидными для кого-то, кто читает ваш код.

Если вы хотите проверить, является ли значение числовым, перед преобразованием его в int, используйте is_numeric (http://php.net/manual/en/function.is-numeric.php). Он проверит строки как числовые, так и целые. Например, если число возвращалось из формы ввода текста через AJAX, это может быть строка. В этом случае is_int вернет false, но is_numeric вернет true.

EDIT

Теперь, когда я знаю, что вы используете DECIMAL для типа столбца MySQL, вы можете сделать что-то вроде этого:

function getItem($pValue)
{

    if (!is_numeric($pValue))
    {
        return false;
    }

    $Query = sprintf
    (
        'SELECT * FROM %s WHERE %s = %.2f',
        'TableName',
        'Price',
        $pValue
    );
    // Do something with $Query
}
0 голосов
/ 12 ноября 2011

Вы также можете использовать is_int ()

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

Я уверен, что есть более «подходящий» способ, но для объема вашего вопроса я бы сказал, да.Если передается какая-то строка, PHP будет интерпретировать ее как ноль при выполнении математической операции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...