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