Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Техническое определение этого — эскапизм
foreach ($params as $key => $value) {
$statement->bindValue($key, $value);
}
$statement->execute($params);
Вот не нравится мне, что $valueKey пишется прямиком в запрос, безо всякой обработки.
Инъекцию там провести, скорее всего, не удастся — будет ошибка «плейсхолдер не найден» при исполнении — но всё равно, сама возможность вписать в запрос произвольный код вызывает очень неуютные ощущения. Я бы не стал экономить на переменной — счетчике.
А вот почему arrayPrepare() не делает execute() — я не понял. Если бы эта функция не делала привязки — тогда понятно: можно было бы сделать несколько вызовов одного и того же prepared запроса. А так она все равно ведь выполняет один запрос за раз — зачем тогда делать отдельный вызов execute()?
$id = '0; drop database some_db;';
print mysql_real_escape_string($id);
0; drop database some_db;
select * from table where id = $id
select * from table where id = 1 or 1=1
"select * from table where id = '".mysql_real_escape_string($username)."'"
"select * from table where id = ".(int)$id
This function is used to create a legal SQL string that you can use in an SQL statement.— вот что там написано.
числа должны валидироваться, как числа
function paraQuery()
{
$args = func_get_args();
$query = array_shift($args);
$query = str_replace("%s","'%s'",$query);
foreach ($args as $key => $val)
{
$args[$key] = mysql_real_escape_string($val);
}
$query = vsprintf($query, $args);
$result = mysql_query($query);
if (!$result)
{
throw new Exception(mysql_error()." [$query]");
}
return $result;
}
$query = "SELECT * FROM table where a=%s AND b LIKE %s LIMIT %d";
$result = paraQuery($query, $a, "%$b%", $limit);
$id = "Вася";
$db->query("DELETE FROM t WHERE id=?i", $id);
SELECT phone_number FROM users WHERE name = 'Mc'Donalds'
, а SELECT phone_number FROM users WHERE name = 'Joe'; DROP TABLE users; --'
для неё ничем не отличается, она их обработает абсолютно одинаково, а не потому что там есть DROP или ещё какой признак инъекций. Если бы была функция защита от инъекций, то она пропустила бы первую строку без изменений (инъекции нет, а корректировка синтаксиса в её задачи не входит), а на вторую бы заругалась (или изменила) — инъекция есть (если она распознает такой тип инъекций), пускай и синтаксис корректен. Если пользователь явно пытается «втюхать» вам какой-то скрипт, вы можете просто удалить его.
I love <!--"Mc'Donalds"-->
<script>alert('ololo');</script>
<s cript>alert(\'ololo\');</s cript>
alert(ololo);
Joe'; DROP TABLE users; --
— именно это я и сохраняю. Ввёл <script>alert('ololo');</script>
— и это сохраняю. Хотя бы для того, чтобы были доказательства попытки взлома, когда он начнет скандалить из-за бана :) И выведу в том же виде, в котором сохранил: вводил в браузере — получит эту строку в браузере. SELECT phone_number FROM users WHERE name = 'Joe'; DROP TABLE users; --'
SELECT phone_number FROM users WHERE name = 'Joe'; DROP TABLE users; --'
<textarea>Pupkin "Ололоша"</textarea>
… но при этом портит данные так, что кроме как в HTML их никуда и вывести-то нельзя
Экранирование (или что нужно знать для работы с текстом в тексте)