Как знать, когда Escape необходим для MySQL

Я нахожусь в процессе создания сайта с CodeIgniter. Это - 1-й сайт, который я создал сам, который взаимодействует с базой данных. Я использую MySQL для этого проекта. Как я могу сказать, нужно ли данных оставить прежде, чем сохранить его к базе данных?

6
задан Teej 12 April 2010 в 02:25
поделиться

8 ответов

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

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

3
ответ дан 8 December 2019 в 14:41
поделиться

Не беспокойтесь о побеге самостоятельно (вы БУДЕТЕ все испортить). Используйте уровень БД, на котором вы сначала подготавливаете оператор, а затем добавляете в него данные.

В PHP вы должны использовать PDO . Вы пишете

SELECT * FROM table WHERE key = :key AND value = :value

, а затем добавляете данные, вызывая функции.

4
ответ дан 8 December 2019 в 14:41
поделиться

Если сомневаетесь, избегайте всего этого. Не может быть слишком безопасно.

Хорошо, хорошо. Я понимаю

ВСЕГДА УБЕГАЙТЕ

1
ответ дан 8 December 2019 в 14:41
поделиться

Вы экранируете строку запроса MySQL, когда любая строка состоит из пользовательского ввода, например:

в PHP: $ username =; / / VALUE FROM USER INPUT

, то ваша строка запроса: "INSERT INTO table ('username') VALUES (". $ Username. ")"

У вас будет чтобы избежать этого запроса mySQL из-за того, что переменная $ username может потенциально иметь вредоносный код, вставленный клиентом для внедрения в вашу базу данных.

-1
ответ дан 8 December 2019 в 14:41
поделиться

Когда бежать? Как только ваш сайт станет общедоступным.

-2
ответ дан 8 December 2019 в 14:41
поделиться

Если данные являются строкой, они должны всегда экранироваться.

Однако вместо этого лучше использовать параметры.

2
ответ дан 8 December 2019 в 14:41
поделиться

Если вы генерируете SQL самостоятельно, а не используете что-то вроде PDO, то вы должны всегда экранировать строки.

Экранирование строк - это основное требование языка SQL. Именно это позволяет использовать в строке такие символы, как апострофы или обратные слеши, без каких-либо проблем. Не существует ситуации, в которой экранирование строк не требуется.

Даже нестроки придется фильтровать, чтобы убедиться, что они действительно не являются строками.

Если вы учитесь, пожалуйста, серьезно подумайте об изучении чего-то вроде PDO, как говорили многие другие, вместо того, чтобы экранировать свои собственные строки.

1
ответ дан 8 December 2019 в 14:41
поделиться

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

Я, например, не знал о подготовленных операторах, когда начинал с базами данных. И я испытал собственное упрямство, когда вступил с ними в контакт. Потому что я уже привык к другим способам ведения дел. Возможно, это не ваша личная торговля персонажем, но в любом случае не помешает начать с нее как можно скорее.

Подготовленные операторы позволяют использовать заполнители в запросах. Затем эти заполнители можно заменить фактическими значениями, привязав их к заполнителям. Этот процесс связывания автоматически экранирует значения.

Вот (простой) пример PDO :

$db = new PDO( /* some database parameters */ );
$statement = $db->prepare( 'INSERT INTO table VALUES( :username, :password )' );
$statement->bindValue( ':username', $dirtyUsername );
$statement->bindValue( ':password', $dirtyPassword );
$result = $statement->execute();
// result checking ommited for brevity

С PDO и подготовленными операторами гораздо больше возможностей. Например, вы можете легко повторно использовать подготовленный оператор в цикле, как таковой:

$statement = $db->prepare( 'INSERT INTO table VALUES( :username, :password )' );
foreach( $users as $dirtyUser )
{
    $statement->bindValue( ':username', $dirtyUser->username );
    $statement->bindValue( ':password', $dirtyUser->password );
    $result = $statement->execute();
    // result checking ommited for brevity
}

Или передать привязки заполнителей методу execute, например:

$statement = $db->prepare( 'INSERT INTO table VALUES( :username, :password )' );
$result = $statement->execute( array( 
                                   ':username' => $dirtyUsername, 
                                   ':password' => $dirtyPassword
                             ) );
// result checking ommited for brevity

... и т. Д. И т. Д.

{{1} }
8
ответ дан 8 December 2019 в 14:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: