Защита от SQL инекций
Добрый день.
Взгляните на код запроса пожалуйста. Достаточно ил таких проверок для устранения угрозы? $strquery = "SELECT * FROM `topics` WHERE `id`='%d'"; $query = sprintf($strquery,mysql_real_escape_string($_GET[id])); |
Ё, чувак, как ты умудрился заработать такую карму(-751)?
|
firstchild,
Наверное такой результат потому, что я её не зарабатывал.Ё |
во-первых, такое впечатление, что ты все свои знания вложил в эту строку, лишь бы как-нибудь чего-нибудь не просочилось. Это называется уличная магия. В данном случае достаточно убрать все нечисловые символы либо проверить их наличие. Во-вторых, не надо сравнивать со строковым значением, если столбец численный. В-третьих, используй фреймворки
|
|
вы, конечно, можете сказать, что int'а в любом случае хватит. Но я бы сделал лучше, если тип столбца не помещается в int. Потому что это не сложно: либо is_numeric, либо filter_var('122312147483648', FILTER_SANITIZE_NUMBER_INT). Хотя возможно бд и к числу в виде строки адекватно отнесется, надо проверять
|
Цитата:
|
Прекрасно.
|
Цитата:
|
Цитата:
|
Цитата:
|
Лучше использовать PDO.
|
а почему лучше?
|
sprintf() - изврат, зачем он здесь нужен? Конкатенация уже не катит?
И вообще, какие нах фреймворки? ) Для чисел - приведение к типу, для строк - mysql_real_escape_string() и будет вам счастье :) ПС. Цитата:
|
Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
|
x-yuri,
Цитата:
Цитата:
Цитата:
|
Kolyaj,
Цитата:
|
Invis1ble,
кэширование, не?! |
Причем здесь кеширование, я пишу о том, что можно обойтись штатными функциями вместо использования всяких модных фреймворков.
Ну тут конечно же каждому свое. |
PDO внештатное?
кэширование не повышает производительность, снимая нагрузку? |
Зачем лепить ООП там, где можно запросто обойтись без него?
|
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
Я никого не призываю не использовать ООП, а лишь спрашиваю, чем использование ОО-подхода выгодней в данной конкретной ситуации.
Возможно я предвзято отношусь к нему и изменю свою точку зрения, если вы укажите объективные доводы в пользу него. |
ситуация не очень конкретна. Если речь идет о том, чем лучше pdo по сравнению с mysql: 1) с ним нельзя наткнуться на проблемы перобразования в int или, кстати, sprintf("%d...), 2) поддержка исключений, 3) однообразный интерфейс для работы с разными БД - не надо для каждой БД учить ее собственный интерфейс, 4) может еще чего, транзакции, например, там есть. Насколько они важны, в каждом конкретном случае решается отдельно. Минусы PDO - немножко более сложный интерфейс. А разницу в производительности, я уверен, вы не заметите. К тому же, у mysql по сути тоже ООП-интерфейс, просто сделан он без использования "настоящих" объектов.
Если же речь идет и о других библиотеках, то у DbSimple мне, кстати, описание (зачем еще одна библиотека) понравилось, но сам не пользовался. Кроме того, есть всякие билдеры, которые упрощают поддержку кода. |
Спасибо конечно за развернутый ответ, но я имел ввиду именно "Защиту от SQL инекций". Т.е. как я понял, ТС пишет код в процедурном стиле, какой смысл ему создавать отдельный объект и защищаться от инъекций с средствами PDO? Конечно, если бы у него все было в ОО-стиле, то да, смысл может и был бы (чисто ради соблюдения общего стиля кода).
|
ты как-то все в кучу смешал. pdo в плане sql-инъекций просто решает часть вопросов за тебя. Т.е. это проще, потому что нужно меньше знать, и это проще, потому что часть служебной логики спрятана в pdo, следовательно легче просмотривать код. Но это была далеко не единственная цель pdo и pdo - не надстройка над расширением mysql, поэтому интерфейс получился сложнее, чем мог бы быть
А то что pdo построено на классах... какая разница? Mysql (расширение) тоже неявно построено на классах. И если язык позволяет использовать ООП, почему его не использовать? В моем понимании, ООП - это продолжение и синтаксический сахар для процедурного программирования. Т.е. не имея возможности использовать соответствующие синтаксические конструкции, ты все равно прийдешь к чему-то классоподобному. Другими словами, ООП способствует несколько другому, более удобному взгляду на программу. Наверное, как когда-то появление функций/процедур/подпрограмм поспособствовало. Хотя при этом оно может провоцировать возникновение ненужных слоев абстракции, или не всегда нужных. Но где ты видел палку об одном конце? |
Цитата:
Ну да ладно, твою точку зрения понял, выводы сделал. Спасибо за разъяснения. |
вы не заметили что ответ на вопрос был дан ещё на первой странице и дальнейшее обсуждение автору тему не надо?
из мухи сделали слона :-E |
Цитата:
Цитата:
Цитата:
|
Спорность в том "что нужно меньше знать, и это проще". Спорно потому, что это основывается на субъективном опыте. Кому-то проще, кому-то - наоборот.
|
x-yuri,
Invis1ble, evgh, Следил за Вашими прениями, но в действительности предложеного мной варианта должно быть достаточно) Кстати может есть рекомендации по хорошему ресурсу о безопасности? |
Цитата:
Цитата:
|
x-yuri,
Я говорю о том, что когда я вижу некий метод мне нужно либо уже знать его, либо лезть в кишки и узнавать, либо штудировать мануалы. Вы ведь не используете вслепую чьи-то наработки? И так как фреймворков и библиотек великое множество - то такое упрятывание деталей мне не то что не помагает, а наоборот мешает. Вместо того чтобы знать одну единственную функцию mysql_real_escape_string() и быть счастливым. ПС. Вот приходит мне щас письмо на почту по подписке на одном ресурсе: [PHP Classes] Added a new class: Basic SQL Injection Protection И спрашивается, нафига мне их класс? По сути, ради одной функции? :) Вы скажете, нет, там с помощью него можно еще корованы грабить! Предположим, это очень полезная для меня функция и я всегда мечтал это сделать, но чтобы убедиться в том, что этот класс действительно умеет грабить корованы, а не какую-то бяку - мне все равно надо лезть в кишки и изучать :) Хорошо, что в письме сразу идет описание: Цитата:
В топку такой класс.... ППС. Цитата:
Довольно сумбурно выразился, но надеюсь моя основная мысль ясна. |
Цитата:
|
ну приведение к типам еще, в корне ситуация все равно не меняется. Или я чего-то не знаю oO ?
|
Цитата:
Цитата:
кроме того, если фреймворк скорее мешает, чем помогает, значит он, как минимум тебе не подходит. Возможно, это просто плохой фреймворк. Возможно, для твоей задачи не нужен фреймворк. Но, возможно, дело в тебе потом, для простых задач можно обойтись без фреймворков. Но для достаточно сложных без них не обойтись. (ты же не будешь утверждать, что надо все писать на ассемблере?) И выхода два - либо воспользоваться существующим фреймворком, либо изобрести свой. Если ты в состоянии реализовать второй вариант - хорошо. Если не в состоянии, но ты это сделал - это хуже, чем первый вариант. Цитата:
хотя я так понял, дело именно в чужом коде. Может тебе приходилось слишком много заниматься поддержкой кода, написанного на каком-нибудь неоправданно сложном для задачи фреймворке? а в случае с экранированием разница действительно незначительна. Но ведь если расширение |
Invis1ble,
Я тебе приведу пример, а ты уж дальше сам скажи что использовать приятней и легче и ... ну в общем думаю будет понятно. Выборка всех полей из таблицы в json с применением PDO: $r = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC); echo json_encode($r); и теперь без:
$arr = array();
$s = mysql_query($sql);
while($r = mysql_fetch_assoc($s)){
$arr[] = '{ "id": "'.$r['id'].'", "title": "'.$r['title'].'", "content":"'.$r['content'].'"}';
} //здесь опущено экранирование переносов строк в content и title
echo '['.implode(",",$arr).']';
или вот так:
function mysql2json($mysql_result,$name) {
$result = array($name => array());
while ($row = mysql_fetch_assoc($mysql_result))
$result[$name][] = $row;
return json_encode($result);
}
или вот так:
function mysql2json($mysql_result,$name){
$json="{\n\"$name\": [\n";
$field_names = array();
$fields = mysql_num_fields($mysql_result);
for($x=0;$x<$fields;$x++){
$field_name = mysql_fetch_field($mysql_result, $x);
if($field_name){
$field_names[$x]=$field_name->name;
}
}
$rows = mysql_num_rows($mysql_result);
for($x=0;$x<$rows;$x++){
$row = mysql_fetch_array($mysql_result);
$json.="{\n";
for($y=0;$y<count($field_names);$y++) {
$json.="\"$field_names[$y]\" : \"$row[$y]\"";
if($y==count($field_names)-1){
$json.="\n";
}
else{
$json.=",\n";
}
}
if($x==$rows-1){
$json.="\n}\n";
}
else{
$json.="\n},\n";
}
}
$json.="]\n};";
return($json);
}
|
вообще-то это не честный пример. Должно быть как-то так:
$r = mysql_query($sql);
$rows = array();
while ($row = mysql_fetch_assoc($r))
$rows[] = $row;
echo json_encode($rows);
|
Цитата:
а выровнять в одну строку? :) и я против опускания {} echo json_encode($pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC)); |
| Часовой пояс GMT +3, время: 20:11. |