Омг. Откуда это взято?Просто задача подготовленных выражений (параметризированных запросов) при любых входных данных результатом выдать валидный и безопасный запрос
и про варенье тоже можете поискатьzerkms
при любых входных данных результатом выдать валидный и безопасный запрос
?из здравого смысла
Но это неважно.Fortop
в большинстве случаев я бы не геморроился, и откавычивал все
$allowed = array('input_name' => 'condition ?');
$params = array_intersect_key($_POST, $allowed);
$conditions = array_intersect_key($allowed, $params);
$sql = 'query' . implode(' AND ', $conditions);
прощай, производительность. привет, implicit type casting.в большинстве случаев я бы не геморроился, и откавычивал все
у меня сложностей нет никаких, поверьВам нравится воевать с ветряными мельницами? Выдумали себе сложности и героически их преодолеваете.
Т.е. цитатки не будет?
... to .gain the security benefits of using prepared statements.
ps: кстати, давай ты впредь не будешь переходить на личности с попытками подковырнуть а-ля "Но куда нам "сирым и убогим"? честно, раздражает. хочешь выглядеть шутом - иди работать в цирк, окей?Prepared statements can help increase security by separating SQL logic from the data being supplied. This separation of logic and data can help prevent a very common type of vulnerability called an SQL injection attack. Normally when you are dealing with an ad hoc query, you need to be very careful when handling the data that you received from the user. This entails using functions that escape all of the necessary trouble characters, such as the single quote, double quote, and backslash characters. This is unnecessary when dealing with prepared statements
?при любых входных данных результатом выдать валидный и безопасный запрос
Угу, когда кончаются аргументы выплывает производительность и скорость....прощай, производительность. привет, implicit type casting.
тогда не смутило. Хотя в определенных случаях тоже могут быть проблемыFortop
в большинстве случаев я бы не геморроился, и откавычивал все
не надо придираться к словам - если запрос записан верно, то использование препаред стейтментов гарантирует, что при любых данных он таковым и останется: валидным и безопасным. это задача препаредов, это написано по ссылкам.Да-да, валидации данных у нас может не быть или быть с ошибками, но запросы то у нас пишутся не людьми (ах, да в рассматриваемом же случае они собираются по частям) и 100% валидны благодаря prepared statemets...
один из аргументов. они у меня не кончились.От кого же я это слышал? Не напомните?
это у тебя они собираются по частям и ты рассматриваешь свой случай. изначально в треде была мысль, что запрос задан в виде строкового литерала с плейсхолдерами.ах, да в рассматриваемом же случае они собираются по частям
Все верно, в приведенном мной примере так и есть.это у тебя они собираются по частям
Эти два случая эквивалентны? Верно?zerkms
запрос задан в виде строкового литерала с плейсхолдерами.
Приплыли?если запрос записан верно
А простите чем для абстракции нижнего уровня (о которой писал ТС) является запрос? Не данными?zerkms
Доверие к данным, которые должны были быть провалидированными, но на факте валидация была или недостаточная или вообще опущена
не надо приплетать пхп вот только сюда. омг, неужели я непонятно изъясняюсь? повторю в третий раз: задача препаредов - при условии корректности исходного запроса с плейсхолдерами обеспечить его корректность и после подстановки любых данных.На всякий случай напомню, PHP не контролирует валидность и корректность синтаксиса SQL запроса.
Ровно такая же ситуация и с prepared statement.
можно и по улице голым ходить. ради спорта и чтобы доказать правоту во что бы то ни стало - легко. из практических побуждений - нет смысла.Можно ли в одной функции производить биндинг и выполнение произвольных запросов с произвольными данными? - можно.
не данными. данные это данные. запрос - это запрос (строка с плейсхолдерами).А простите чем для абстракции нижнего уровня (о которой писал ТС) является запрос? Не данными?
тогда подготовленные выражения не смогут обеспечить должной безопасности. (разве что все параметры под одну гребёнку будут причёсаны под строки)Должна ли эта функция заниматься приведением типов, валидацией и т.д. и т.п.? - на мой взгляд не должна (этим надо заниматься в абстракциях уровнем выше)
mysqli_bind_param($stmt, "s", $var1);
mysqli_bind_param($stmt, "s", $var2);
mysqli_bind_param($stmt, "ss", $var1, $var2);
function dbGetDataTable()
{
$numargs = func_num_args();
if($numargs < 1)
{
printf("Неверное количество параметров.");
exit();
}
$link = mysqli_connect(dbHost, dbUser, dbPassword, dbBase);
if (mysqli_connect_errno())
{
printf("Подключение невозможно: %s\n", mysqli_connect_error());
exit();
}
$query = func_get_arg(0);
if ($stmt = mysqli_prepare($link, $query))
{
if($numargs > 2)
{
$execText = "";
for($i = 2; $i < $numargs - 1; $i++)
{
$execText .= "\$param" . $i . "=" . func_get_arg($i) . "; ";
}
$execText .= "mysqli_bind_param(\$stmt, \"" . func_get_arg(1). "\", ";
for($i = 2; $i < $numargs - 1; $i++)
{
$execText .= "\$param" . $i;
if($i != $numargs - 2)
{
$execText .= ", ";
}
}
$execText .= ");";
eval ($execText);
}
mysqli_execute($stmt);
mysqli_stmt_bind_result($stmt, $data);
while (mysqli_stmt_fetch($stmt))
{
...
}
mysqli_stmt_close($stmt);
}
mysqli_close($link);
....
}
$dataTable = dbGetDataTable("SELECT ? FROM Dual UNION SELECT ? FROM Dual", "ds", 123, "abc", 1);
$param2=123; $param3=abc; mysqli_bind_param($stmt, "ds", $param2, $param3);
[...]Не понимаю, зачем вы спорите - проверка входных данных и подстановка параметров в запрос, вещи совершенно не связанные
Пффф. Так ведь можно таки, правда в [m]PDO[/m]Я почему-то решил, что привязывать параметры можно по одному
mysqli_bind_param($stmt,_"s",_$var1);
mysqli_bind_param($stmt,_"s",_$var2);
будем играть по твоим правилам: цитату, где я говорил что нужна проверка, а не приведение типов?[...]
Сударь, давайте вы не будете приписывать мне слова, которые я не говорил, ок?Я дискуссию с Вами закончил 4мя сообщениями выше. И, прошу прощения, возобновлять ее не собираюсь.
а вот с этого места поподробнее, в каких сообщениях Я говорил о валидации. А о "sanitize'ации" - если ты не понимаешь смысла термина, то выдумывать его своим больным мозгом не нужно.где речь шла о приведении типов, валидации(она же проверка) и еще sanitize'ации(что уж тут подразумевалось, я даже выяснять не буду)?
Ваши бы слова, да Вам бы в ушиА о "sanitize'ации" - если ты не понимаешь смысла термина, то выдумывать его своим больным мозгом не нужно
я не увязывал валидацию - это твои слова, которые ты опять приписываешь мне. (это я говорил уже раза 3)Как только Вас не затруднит объяснить каким образом Вы увязали валидацию, "sanitize'ацию" и prepared statements
тем, что приписываешь мне слова, которых я не говорил. (это я повторяю во второй раз)Я тут причем?
в течение всего разговора я ни разу не сменил точку зрения, я лишь повторяю одну и ту же мысль, а в итоге - моим ником подписывают не мои слова.не вертитесь, как уж на сковородке
Я предложил делать валидацию.Fortop
Делать валидацию на этапе формы? не?zerkms
которые нужно приводить к какому-то конкретному типу: float, int
Вы отлично приняли его как замену, посчитали частью своей "saniteze'ации", которую ну никак не хотели разбивать на две части. И которая крайне нужна для Вас в контексте обсуждаемых в топике prepared statementszerkms
итого логика sanitize'ации запроса разбивается на 2 части ))Fortop
Делать валидацию на этапе формы? не?
А теперь у нас оказывается что если мы не сделаем валидацию или ее не будет, то данные ВНЕЗАПНО окажутся не закавычены и не обработаны, например, mysql_real_escape_string или теми же prepared statementszerkms
Доверие к данным, которые должны были быть провалидированными, но на факте валидация была или недостаточная или вообще опущена, что в итоге приведёт к добавлению в запрос данных as-is, не заключая в кавычки и не применяя специальных функций - в итоге может привести сами знаете к чемуFortop
Да хоть на 15ть.
Кавычки в запросе и mysql_real_escape_string не имеет никакого отношения к валидации. А валидация достаточно часто нужна и без записи в БД.
Врем?zerkms
я не увязывал валидацию
Поэтому я бы и рад что-нибудь опровергнуть, да Ваши собственные слова мне не позволяют этого.Fortop
Есть у меня смутные подозрения, что Вы банально путаете и смешиваете такие вещи как - валидацию, фильтрацию и приведение типов.
неправильно. это не замена.Вы отлично приняли его как замену, посчитали частью своей "saniteze'ации", которую ну никак не хотели разбивать на две части. И которая крайне нужна для Вас в контексте обсуждаемых в топике prepared statements
нет, не врём. я валидацию не предлагал. я лишь в одном месте согласился, что в твоём варианте она может быть частью sanitize.Врем?