Передача числовой переменной и предотвращение внедрения SQL - PullRequest
4 голосов
/ 29 января 2012

У меня такой запрос:

SELECT name FROM mytable WHERE id = $id

, где $id дано от пользователя.Я добавляю косую черту для входной переменной.Достаточно ли использовать только (int)$id для предотвращения внедрения SQL?Или я должен проверить $id с помощью is_numeric перед передачей его на запрос?

Отредактировано: язык сценариев - PHP.

Ответы [ 4 ]

6 голосов
/ 29 января 2012

Да, приведение переменной с помощью (int) или intval() гарантирует, что результатом будет только число и никаких других символов.Это хороший способ защиты от атак с использованием SQL-инъекций, но, конечно, он работает только для числовых переменных.

Подробнее о методах защиты с помощью SQL-инъекций см. Мою презентацию Мифы и ошибки SQL-инъекций , или глава в моей книге Антипаттерны SQL: предотвращение ловушек программирования баз данных .

3 голосов
/ 30 января 2012

Я бы отказался от идеи выяснить, как безопасно добавить число к строке запроса, и вместо этого просто перейти к идее всегда использовать подготовленные операторы.Они немного более многословны и утомительны для написания, но гораздо безопаснее - и если вы привыкнете, вам не придется беспокоиться о том, правильно ли вы сделали это в том или ином случае, может быть, иногда это число,В других случаях это строка, вы использовали правильный механизм побега?

2 голосов
/ 29 января 2012

Спросите $ id, является ли оно целым числом, равно ли оно или больше 0. Или иначе попытка ввода данных пользователем, скорее всего, будет в игре.

Пример:

$id = (false! == (int) $ _ GET ['id']> = 0)?(int) $ _ GET ['id']: die (header ("Location: ./index.php"));

0 голосов
/ 29 января 2012
function mysql_prep( $value ) {
    $magic_quotes_active = get_magic_quotes_gpc();
    $new_enough_php = function_exists( "mysql_real_escape_string" ); // i.e. PHP >= v4.3.0
    if( $new_enough_php ) { // PHP v4.3.0 or higher
        // undo any magic quote effects so mysql_real_escape_string can do the work
        if( $magic_quotes_active ) { $value = stripslashes( $value ); }
        $value = mysql_real_escape_string( $value );
    } else { // before PHP v4.3.0
        // if magic quotes aren't already on then add slashes manually
        if( !$magic_quotes_active ) { $value = addslashes( $value ); }
        // if magic quotes are active, then the slashes already exist
    }
    return $value;
}   

$username = trim(mysql_prep($_POST['username']));   

Используйте эту функцию, чтобы быть чертовски безопасным !!! : D

...