2009-09-08 1 views
8

Мы все знаем, что параметризованный SQL - это способ работать с пользовательским вводом и динамическим SQL, но отличает от строки до int (или двойной или длинной или любой другой) эффективен, если ввод, который вы ищете, является числовым?SQL Injection Protection - преобразование из строки в int

Я предполагаю, что я спрашиваю, является ли эта техника непогрешимой в отношении SQL-инъекции?

ответ

10

Я не эксперт, но я уверен, что это будет безопасно.

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

Кроме того, параметрирование вашего SQL имеет другие преимущества, а не только защиту от инъекций.

1

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

2

Если строка была действительным номером, прежде чем вы отправите ее в целое число yes, это безопасно. Но вы должны убедиться, что это действительное целое число, прежде чем передать его в int.

Я не знаю, какой язык на стороне сервера вы используете, но на PHP вы можете использовать is_numeric(). Например:

$strYouExpectToBeInt = $_POST['id']; 
try { 
    if (false === is_numeric($strYouExpectToBeInt)) { 
     throw new Exception('id is not a numeric string or a number'); 
    } 
    $strYouExpectToBeInt = (int)$strYouExpectToBeInt; 
    if (false === is_int($strYouExpectToBeInt)) { 
     throw new Exception('id is not a valid integer'); 
    } 

    // everything is ok, you can use $strYouExpectToBeInt 
    // in SQL query now 

} catch (Exception $e) { 
    echo $e->getMessage(); 
} 
+0

Чувак, почему вы используете константу в левой жизни? – arthurprs

1

Возможно, но стоит испытывать.

Что касается ответа Ричарда, у меня иногда возникали проблемы с IsNumeric(), который был немного более либеральным в том, что он будет принимать как действительное число, чем фактическое CAST на числовое (в зависимости от настроек локализации). Такие вещи, как «-0», «3E-5», «5.000.000», иногда удовлетворяют IsNumeric, но не отображаются правильно. Поэтому я обычно делаю полную попытку, вместо этого поймаю фактическое утверждение.

+0

Да, именно поэтому я использую is_int() после кастинга, чтобы убедиться. –

Смежные вопросы