За последние 24 часа нас посетили 22454 программиста и 1031 робот. Сейчас ищут 607 программистов ...

экранирования запросов в бд

Тема в разделе "PHP для новичков", создана пользователем wolf777, 8 ноя 2014.

  1. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    Код (Text):
    1. $MODULE = mysql_real_escape_string($MODULE);
    2. $ET=get_sql_table('events.id',"(module='$MODULE' or module='*') and (unit='".mysql_real_escape_string($UNIT)."' or unit='*')");
    ребят какой метод экранирования верный? так

    Код (Text):
    1. $MODULE = mysql_real_escape_string($MODULE);
    и в запросе мы пишем
    Код (Text):
    1. module='$MODULE'
    или так

    Код (Text):
    1. '".mysql_real_escape_string($UNIT)."
    Добавлено спустя 23 минуты 18 секунд:
    наверное и так правильно и так, если не ошибасюь
     
  2. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    php.net/manual/ru/pdo.prepared-statements.php
     
  3. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Верно.
    все еще ошибки исправляете?:)

    Ему система досталась от величйшего гуру пхп современности. Это не его случай:)
     
  4. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    smitt да просто в свое время взял cms кривую, она точно досталась от "гуру программиста", она как друшлак, вся в дырках) вот пытаюсь все дырки cms за экранировать)))

    Добавлено спустя 34 минуты 34 секунды:
    smitt перешел по ссылки которую вы дали php.net/manual/ru/pdo.prepared-statements.php
    и увидел интересный момент для чего тут переменная ещё $dbh которая обращается к закрытой переменной

    $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
     
  5. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    В документации по PDO php.net/manual/ru/pdo.connections.php
    Код (PHP):
    1. <?php
    2. $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
    3. ?>
     
  6. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    metadon ааа ясненько спасибо)
     
  7. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    не буду создавать новых тем, спрошу тут как мне за экранировать $clause

    Код (Text):
    1. function get_sql_count($table,$clause='') {
    2.   if ($clause!='') $clause="where $clause";
    3.   $q="select count(*) from $table $clause";
    4.   if (!$r=mysql_query($q)) return(0);
    5.   list($n)=mysql_fetch_row($r);
    6.   return($n);
    7.   }
     
  8. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    с помощью функций для экранирования и конкатенации
     
  9. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    metadon ну это я знаю, ну а как это сделать? так?
    Код (Text):
    1. function get_sql_count($table,$clause='') {
    2.   if ($clause!='') $clause= mysql_real_escape_string($clause);
    3.  $q="select count(*) from $table $clause";
    4.   if (!$r=mysql_query($q)) return(0);
    5.   list($n)=mysql_fetch_row($r);
    6.   return($n);
    7.   }
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.552
    Симпатии:
    1.754
    Экранируются только переменные. Экранируя всю часть where вы нарвётесь на неприятности. Т.е. экранировать в вашем случае надо при вызове get_sql_count:
    Код (Text):
    1.  
    2. $с = get_sql_count("article", sprintf("slug='%s'", mysql_real_escape_string($_REQUEST["slug"])));
    Что-то в этом роде. sprintf - чтоб не использовать конкатенацию, мне так просто больше нравится
     
  11. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    ну я впринципе и так экранирую только переменные, ну просто тут как её за экранировать, надо как то тут

    Код (Text):
    1.  $clause="where $clause"; за экранировать $clause
    Код (Text):
    1. function get_sql_count($table,$clause='') {
    2.   if ($clause!='') $clause="where $clause";
    3.   $q="select count(*) from $table $clause";
    4.   if (!$r=mysql_query($q)) return(0);
    5.   list($n)=mysql_fetch_row($r);
    6.   return($n);
    7.   }
    Добавлено спустя 39 минут 57 секунд:
    получается в функциях уязвимостей нет? и экранировать переменные в самих функциях не стоит?
     
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.552
    Симпатии:
    1.754
    Блин, ну посмотрите. Экранировать надо значения, подставляемые в запрос. Если вы своё $clause будете экранировать, вы нарушите синтаксис запроса, поскольку код предполагает, что в неё записана часть запроса. Тут речь идёт о конкретной функции, код которой вы показали. Зависит не от переменной, а от того, какую роль играет эта переменная в запросе. Если она содержит инструкции SQL, то её нельзя экранировать - нарушите синтаксис запроса. Если она содержит значение, подставляемое в запрос - необходимо. Вообще, вы берётесь менять кем-то написанный движок, слабо себе представляя, что делаете.
     
  13. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    mkramer да вы правы я экранирую в чужом движке, поэтому и тяжело это делается, спасибо за помощь щас ещё в инете почитаю