Я нахожусь в процессе создания сайта с CodeIgniter. Это - 1-й сайт, который я создал сам, который взаимодействует с базой данных. Я использую MySQL для этого проекта. Как я могу сказать, нужно ли данных оставить прежде, чем сохранить его к базе данных?
Если вы используете класс базы данных с привязками запросов , вам не нужно ничего делать экранирование вручную:
Второстепенное преимущество использования связывания заключается в том, что значения автоматически экранируются, что обеспечивает более безопасные запросы. Вам не нужно забывать вручную экранировать данные; двигатель делает это автоматически за вас.
Не беспокойтесь о побеге самостоятельно (вы БУДЕТЕ все испортить). Используйте уровень БД, на котором вы сначала подготавливаете оператор, а затем добавляете в него данные.
В PHP вы должны использовать PDO . Вы пишете
SELECT * FROM table WHERE key = :key AND value = :value
, а затем добавляете данные, вызывая функции.
Если сомневаетесь, избегайте всего этого. Не может быть слишком безопасно.
Хорошо, хорошо. Я понимаю
ВСЕГДА УБЕГАЙТЕ
Вы экранируете строку запроса MySQL, когда любая строка состоит из пользовательского ввода, например:
в PHP: $ username =; / / VALUE FROM USER INPUT
, то ваша строка запроса:
"INSERT INTO table
('username') VALUES (". $ Username. ")"
У вас будет чтобы избежать этого запроса mySQL из-за того, что переменная $ username может потенциально иметь вредоносный код, вставленный клиентом для внедрения в вашу базу данных.
Когда бежать? Как только ваш сайт станет общедоступным.
Если данные являются строкой, они должны всегда экранироваться.
Однако вместо этого лучше использовать параметры.
Если вы генерируете SQL самостоятельно, а не используете что-то вроде PDO, то вы должны всегда экранировать строки.
Экранирование строк - это основное требование языка SQL. Именно это позволяет использовать в строке такие символы, как апострофы или обратные слеши, без каких-либо проблем. Не существует ситуации, в которой экранирование строк не требуется.
Даже нестроки придется фильтровать, чтобы убедиться, что они действительно не являются строками.
Если вы учитесь, пожалуйста, серьезно подумайте об изучении чего-то вроде PDO, как говорили многие другие, вместо того, чтобы экранировать свои собственные строки.
Я бы посоветовал вам приучить себя использовать заранее подготовленные утверждения. Тем более, что вы новичок в работе с базами данных. Чем раньше вы начнете их использовать, тем легче это станет вашей второй натурой.
Я, например, не знал о подготовленных операторах, когда начинал с базами данных. И я испытал собственное упрямство, когда вступил с ними в контакт. Потому что я уже привык к другим способам ведения дел. Возможно, это не ваша личная торговля персонажем, но в любом случае не помешает начать с нее как можно скорее.
Подготовленные операторы позволяют использовать заполнители в запросах. Затем эти заполнители можно заменить фактическими значениями, привязав их к заполнителям. Этот процесс связывания автоматически экранирует значения.
Вот (простой) пример 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} }