За последние 24 часа нас посетили 64295 программистов и 1754 робота. Сейчас ищут 870 программистов ...

Безопасность скрипта

Тема в разделе "PHP для новичков", создана пользователем Andrey5555, 27 мар 2008.

  1. Andrey5555

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

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    Безопасен ли этот скрипт:

    <?php
    include ("mysql.php");
    $tit = $_POST ['title'];
    $tit = htmlspecialchars ($tit, ENT_QUOTES);
    if (empty ($tit)) die ("<b>Вы не ввели название !!!</b>");
    if (strlen ($tit) > 50) die ("<b>Название слишком длинное !!!</b> ");
    $title_query = mysql_query ("SELECT title FROM sections WHERE (title = '$tit') LIMIT 1");
    if (mysql_num_rows ($title_query) > 0) die ("<b>Раздел уже существует !!!</b>");
    mysql_query ("INSERT INTO sections (title) VALUES ('$tit')");
    echo "Раздел успешно добавлен !!!";
    ?>

    Или еще добавить mysql_real_escape_string?

    Но при выводе перед кавычками не должны появляться слеши.
     
  2. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
  3. Ильич

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

    С нами с:
    22 мар 2006
    Сообщения:
    14
    Симпатии:
    0
    Адрес:
    Ярославль
    Я бы сделал вот так:
    PHP:
    1. <?php
    2. include ($_SERVER["DOCUMENT_ROOT"]."/some/path/to/mysql.php");
    3. $tit = trim($_POST ['title']);
    4. if (empty($tit))
    5.   die ("<b>Вы не ввели название !!!</b>");
    6. if (strlen($tit) > 50)
    7.   die ("<b>Название слишком длинное !!!</b> ");
    8. $title_query = mysql_query ("SELECT title FROM sections WHERE title='".$tit."' LIMIT 1");
    9. if (mysql_num_rows ($title_query) > 0)
    10.   die ("<b>Раздел уже существует !!!</b>");
    11. $res = mysql_query ("INSERT INTO sections (title) VALUES ('".$tit."')");
    12. if ($res)
    13.   echo "Раздел успешно добавлен !!!";
    14. else
    15.   echo "Ошибка!!!";
    16. ?>
     
  4. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Andrey5555
    mysql_real_escape_string

    Использование конструкции die при проверке КРАЙНЕ НЕЖЕЛАТЕЛЬНО!
    Нельзя совать их куда попало.
     
  5. Andrey5555

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

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    Как я понял используем stripslashes при выводе, но при обработке mysql_real_escape_string.

    А почему нежелательно использовать die?
     
  6. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Andrey5555
    Как почему?
    Ну вот представьте. Пишите вы проект какой-то. Модульный. Внутри модуля - всякие проверки. Ну, к примеру такая
    PHP:
    1.  
    2. <?php
    3. $name = $_POST['name'];
    4. if (empty ($name)) die ("Имя осталось пустым");
    5. ?>
    6.  
    Лучше использовать такое:
    PHP:
    1.  
    2. <?php
    3. $name = $_POST['name'];
    4. $err = array();
    5. if (empty ($name)) $err[] = 'имя осталось пустым';
    6. ...
    7. ?>
    8.  
    А потом уже обрабатывать эти ошибки и выводить их красиво в шаблон. ;)
     
  7. Andrey5555

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

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    Понятно)) А на счет mysql_real_escape_string и stripslashes я правильно понял?

    echo "<td>$title</td>";

    Где мне тут использовать stripslashes?
     
  8. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
  9. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Andrey5555
    mysql_real_escape_string используется при добавлении данных в базу. На конечный вывод они никак не влияют.
    К примеру
    $title = htmlspecialchars ($_POST['title']);
    ...
    INSERT into `table` (title) VALUES ('".mysql_real_escape_string($title)."');
     
  10. Andrey5555

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

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    У меня оно добавляет в базу данных с слешми. И когда я вывожу из базы оно отображаеться тоже со слешами.
    Вот так и тп:
    \'
     
  11. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0