За последние 24 часа нас посетил 16261 программист и 1726 роботов. Сейчас ищет 751 программист ...

Как избавится от экранирования кавычек слэшами?

Тема в разделе "PHP для новичков", создана пользователем vano007, 23 июл 2010.

  1. vano007

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

    С нами с:
    24 ноя 2009
    Сообщения:
    37
    Симпатии:
    0
    Есть скрипт, редактирующий запись в бд. Извлекает он запись нормально, а при сохранении экранирует каждую кавычку слэшами. Как это исправить?

    PHP:
    1. <?php
    2.  
    3.  
    4.  
    5. mysql_connect('------', '------', '------') or die('Ошибка соединения с БД') ;
    6. mysql_select_db('------') or die('Ошибка при выборе БД') ;
    7.  
    8. // Получаем и валидируем требуемое действие
    9. $action = (isset($_POST['action']) && in_array($action, array('save', 'get' )))
    10.   ? $_POST['action']
    11.   : '';
    12.  
    13. // Инициализируем все используемые переменные для защиты от атак через
    14. // register_globals
    15. $message = $text = $id = '';
    16.  
    17. switch ($action)
    18. {
    19.   case 'get': // извлечение новости
    20.     $id = intval($_POST['id']); // в очередной раз обращаю внимание
    21.                                 // на приведение к целому для защиты от инъекции
    22.     $result = mysql_query('SELECT `news_text` FROM `news` WHERE `id` = '.$id);
    23.          if (mysql_num_rows($result) > 0) // если новость извлеклась
    24.     {
    25.       $text = reset(mysql_fetch_row($result));
    26.     }
    27.     else
    28.     {
    29.       $message = 'Новость не найдена!';
    30.       $action = ''; // сбрасываем действие, чтобы в форме показалась кнопка "извлечь"
    31.     }
    32.          mysql_free_result($result);
    33.     break;
    34.      case 'save': // сохранение новости
    35.     $id = intval($_POST['id']);
    36.     $text = $_POST['text'];
    37.          if (false === mysql_query('
    38.      UPDATE
    39.        `news`
    40.      SET
    41.        `news_text` = \''.mysql_real_escape_string($text).'\'
    42.      WHERE
    43.        `id` = '.$id.'
    44.    ') )
    45.     {
    46.       $message = 'Не удалось сохранить новость!';
    47.     }
    48.     else
    49.     {
    50.       $message = 'Новость успешно сохранена!';
    51.       $text = ''; // чтобы текст не вывелся снова
    52.     }
    53.          break;
    54. }
    55.  
    56. if ($message != '')
    57. {
    58.   echo "<b>$message</b><br><br>";
    59. }
    60.  
    61. ?>
    62. <form method="POST" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>">
    63.   ID новости:<br>
    64.   <input <?php echo $action != 'get' ? 'type="text" size="60"' : 'type="hidden"'; ?> name="id" value="<?php echo $id; ?>"><br>
    65. <?php if (!empty($text)) { ?>
    66.   Текст новости:<br>
    67.   <textarea name="text" cols="60" rows="8"><?php echo htmlspecialchars($text); ?></textarea><br>
    68. <?php } ?>
    69.   <button type="submit" name="action" value="<?php echo $action == 'get' ? 'save' : 'get'; ?>"><?php echo $action == 'get' ? 'Сохранить' : 'Извлечь'; ?> новость</button>
    70. </form>
     
  2. host

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

    С нами с:
    20 июн 2007
    Сообщения:
    733
    Симпатии:
    3
    заменть mysql_real_escape_string($text) на $text
     
  3. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Хотя не, наверное GPC обработаются еще до выполнения этой операции. Тогда так
    PHP:
    1. <?
    2.      $_POST = stripslashes_array($_POST);
    3. }
    PHP:
    1. <?
    2. function stripslashes_array($array) {
    3.     foreach ($array as &$value) {
    4.         if (is_array($value)) {
    5.             $value = stripslashes_array($value);
    6.         } else {
    7.             $value = stripslashes($value);
    8.         }
    9.     }
    10.     return $array;
    11. }
     
  5. vano007

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

    С нами с:
    24 ноя 2009
    Сообщения:
    37
    Симпатии:
    0
    А зачем нужно вот это: \' перед '.mysql_real_escape_string($text).' и после него?
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
  7. vano007

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

    С нами с:
    24 ноя 2009
    Сообщения:
    37
    Симпатии:
    0
    Там написано
    "добавленные слеши НЕ идут в базу. Они нужны только в запросе. При попадании в базу слеши отбрасываются. Соответственно, распространенной ошибкой является применение stripslashes при получении данных из базы."
    Так какого они у меня при выводе появляются, раз они не заносятся? Ведь вроде все правильно в скрипте сделано.
     
  8. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Да потому что с логикой проблемы, с формальной логикой.
    Двойное слеширование, ДВОЙНОЕ.
    Экранирование данных функцией mysql_real_escape_string и неявный вызов addshashes.
     
  9. vano007

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

    С нами с:
    24 ноя 2009
    Сообщения:
    37
    Симпатии:
    0
    Т.е. надо оставить что то одно?
     
  10. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Да. Или, как плохой, но тоже вариант, обрезать вторые при выводе.
     
  11. vano007

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

    С нами с:
    24 ноя 2009
    Сообщения:
    37
    Симпатии:
    0
    Вот так сойдет?
    `news_text` = '.mysql_real_escape_string($text).'
     
  12. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Смотри ответ [vs]
     
  13. vano007

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

    С нами с:
    24 ноя 2009
    Сообщения:
    37
    Симпатии:
    0
    Помогло! Всем спасибо :)