Безопасное выполнение sql-запросов

Slon747

Новичок
Безопасное выполнение sql-запросов

Во всех доках пишут об экранировании кавычек в значениях, получаемых от пользователя перед использованием их в запросе. Это понятно.
Но мне непонятно, зачем нужно еще и обрезать значения-строки до определенной длины?
Если есть, к примеру, char(30) или varchar(30), а я пытаюсь записать 50 символов, то всё равно в бд будет обрезано значение.
А может это просто правило хорошего тона?
Спасибо.
 

Фанат

oncle terrible
Команда форума
Во всех доках пишут об экранировании кавычек в значениях, получаемых от пользователя дураки.

экранировать надо НЕ КАВЫЧКИ, и не в данных поступающих от пользователя.
а спецсимволы. и в любых данных, откуда бы они не поступали.
 

Slon747

Новичок
Автор оригинала: Фанат
Во всех доках пишут об экранировании кавычек в значениях, получаемых от пользователя дураки.

экранировать надо НЕ КАВЫЧКИ, и не в данных поступающих от пользователя.
а спецсимволы. и в любых данных, откуда бы они не поступали.
Это я недостаточно правильно выразился.
Я экранирую как в написано PHP Manual:
==========================================

Пример 3. Лучший вариант составления запроса
Применение mysql_real_escape_string() к каждой переменной, вставляемой в запрос, предотвращает SQL Injection. Нижеследующий код является наилучшим вариантом составления запросов и не зависит от установки Magic Quotes.

PHP:
<?php
// Функция экранирования переменных
function quote_smart($value)
{
    // если magic_quotes_gpc включена - используем stripslashes
    if (get_magic_quotes_gpc()) {
        $value = stripslashes($value);
    }
    // Если переменная - число, то экранировать её не нужно
    // если нет - то окружем её кавычками, и экранируем
    if (!is_numeric($value)) {
        $value = "'" . mysql_real_escape_string($value) . "'";
    }
    return $value;
}

// Соединяемся
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
    OR die(mysql_error());

// Составляем безопасный запрос
$query = sprintf("SELECT * FROM users WHERE user=%s AND password=%s",
            quote_smart($_POST['username']),
            quote_smart($_POST['password']));

mysql_query($query);
?>

Запрос, составленный таким образом, будет выполнен без ошибок, и взлом с помощью SQL Injection окажется невозможен.

==========================================
 

Фанат

oncle terrible
Команда форума
Это я недостаточно правильно выразился.
поправка принимается
Я экранирую как в написано PHP Manual:
хе хе.
это не совсем "лучший вариант". просто перевод остаёт от оригинала.
в английской версии уже исправили, после моего замечания.
вот, как правильно:
http://ru.php.net/manual/en/function.mysql-real-escape-string.php

суть в том, что magic_quotes не должно иметь никакого отношения к работе с бд.
 
Сверху