Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Защита от SQL инекций (https://javascript.ru/forum/server/17763-zashhita-ot-sql-inekcijj.html)

Invis1ble 09.06.2011 02:11

Спорность в том "что нужно меньше знать, и это проще". Спорно потому, что это основывается на субъективном опыте. Кому-то проще, кому-то - наоборот.

0931454574 10.06.2011 11:29

x-yuri,
Invis1ble,
evgh,
Следил за Вашими прениями, но в действительности предложеного мной варианта должно быть достаточно) Кстати может есть рекомендации по хорошему ресурсу о безопасности?

x-yuri 10.06.2011 12:45

Цитата:

Сообщение от Invis1ble
Спорность в том "что нужно меньше знать, и это проще". Спорно потому, что это основывается на субъективном опыте. Кому-то проще, кому-то - наоборот.

Мой субъективный опыт подсказывает, что человек не может удерживать в голове слишком много информации. Поэтому ему свойственно прятать детали, обращаясь к ним по мере необходимости. Так появились функции, классы, объекты, предложения, абзацы, главы и модель OSI. А о каком субъективном опыте говоришь ты?

Цитата:

Сообщение от 0931454574
но в действительности предложеного мной варианта должно быть достаточно)

...пока значения находятся в пределах php-типа int

Invis1ble 10.06.2011 23:08

x-yuri,
Я говорю о том, что когда я вижу некий метод мне нужно либо уже знать его, либо лезть в кишки и узнавать, либо штудировать мануалы. Вы ведь не используете вслепую чьи-то наработки? И так как фреймворков и библиотек великое множество - то такое упрятывание деталей мне не то что не помагает, а наоборот мешает. Вместо того чтобы знать одну единственную функцию mysql_real_escape_string() и быть счастливым.

ПС. Вот приходит мне щас письмо на почту по подписке на одном ресурсе: [PHP Classes] Added a new class: Basic SQL Injection Protection
И спрашивается, нафига мне их класс? По сути, ради одной функции? :)
Вы скажете, нет, там с помощью него можно еще корованы грабить! Предположим, это очень полезная для меня функция и я всегда мечтал это сделать, но чтобы убедиться в том, что этот класс действительно умеет грабить корованы, а не какую-то бяку - мне все равно надо лезть в кишки и изучать :)

Хорошо, что в письме сразу идет описание:
Цитата:

Detailed description:This class can cleanup harmful text from request parameters.

It can check a given parameter value of $_GET, $_POST or $_REQUEST super-global variables and remove certain types of text values that are usually used to perform SQL injection attacks.
Какое счастье!!! Вместо того, чтобы экранировать кавычки и т.п. он это все удаляет! =)
В топку такой класс....

ППС.
Цитата:

Сообщение от x-yuri
человек не может удерживать в голове слишком много информации.

И где в итоге приходится больше помнить? Помнить одну функцию mysql_real_escape_string() или помня код (или по крайней мере названия) 100500 методов из различных чудо-библиотек, чтобы уверенно ориентироваться в чужом коде?

Довольно сумбурно выразился, но надеюсь моя основная мысль ясна.

dmitriymar 11.06.2011 00:19

Цитата:

Сообщение от Invis1ble
mysql_real_escape_string()

дак её одной мало для защиты от инъекций ....

Invis1ble 11.06.2011 00:30

ну приведение к типам еще, в корне ситуация все равно не меняется. Или я чего-то не знаю oO ?

x-yuri 12.06.2011 17:30

Цитата:

Сообщение от Invis1ble
Я говорю о том, что когда я вижу некий метод мне нужно либо уже знать его, либо лезть в кишки и узнавать, либо штудировать мануалы. Вы ведь не используете вслепую чьи-то наработки?

...либо понять как он работает по названию, сигнатуре, по аналогии с другим методом/фреймворком, из примера

Цитата:

Сообщение от Invis1ble
И так как фреймворков и библиотек великое множество - то такое упрятывание деталей мне не то что не помагает, а наоборот мешает. Вместо того чтобы знать одну единственную функцию mysql_real_escape_string() и быть счастливым.

и так как фреймворков и библиотек великое множество, приходится выбирать. А так как хороших вариантов не так много, то и выбор не так сложен

кроме того, если фреймворк скорее мешает, чем помогает, значит он, как минимум тебе не подходит. Возможно, это просто плохой фреймворк. Возможно, для твоей задачи не нужен фреймворк. Но, возможно, дело в тебе

потом, для простых задач можно обойтись без фреймворков. Но для достаточно сложных без них не обойтись. (ты же не будешь утверждать, что надо все писать на ассемблере?) И выхода два - либо воспользоваться существующим фреймворком, либо изобрести свой. Если ты в состоянии реализовать второй вариант - хорошо. Если не в состоянии, но ты это сделал - это хуже, чем первый вариант.

Цитата:

Сообщение от Invis1ble
И где в итоге приходится больше помнить? Помнить одну функцию mysql_real_escape_string() или помня код (или по крайней мере названия) 100500 методов из различных чудо-библиотек, чтобы уверенно ориентироваться в чужом коде?

помнить как использовать проще, чем помнить как написать с нуля. Но я не говорил "помнить". Я говорил "удерживать в голове". Это означает, что нельзя написать что-то достаточно сложное, не используя функции, методы, классы. Создавая функцию, ты прячешь ее реализацию за ее именем. Если нужно постоянно смотреть в реализацию, возможно, ты неудачно определился с обязанностями функции, ее именем или еще чем-нибудь. В общем, не удалась функция. Ты ведь используешь функции?

хотя я так понял, дело именно в чужом коде. Может тебе приходилось слишком много заниматься поддержкой кода, написанного на каком-нибудь неоправданно сложном для задачи фреймворке?

а в случае с экранированием разница действительно незначительна. Но ведь если расширение

Gozar 13.06.2011 19:05

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);
}

x-yuri 14.06.2011 19:03

вообще-то это не честный пример. Должно быть как-то так:
$r = mysql_query($sql);
$rows = array();
while ($row = mysql_fetch_assoc($r))
    $rows[] = $row;
echo json_encode($rows);

Gozar 14.06.2011 19:43

Цитата:

Сообщение от x-yuri (Сообщение 108697)
вообще-то это не честный пример. Должно быть как-то так:
$r = mysql_query($sql);
$rows = array();
while ($row = mysql_fetch_assoc($r))
    $rows[] = $row;
echo json_encode($rows);

согласен, но ведь и json_encode() не всегда было, ведь если не учить ничего нового, так и json_encode вроде не нужно.
а выровнять в одну строку? :) и я против опускания {}
echo json_encode($pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC));


Часовой пояс GMT +3, время: 08:58.