За последние 24 часа нас посетил 17631 программист и 1669 роботов. Сейчас ищут 1552 программиста ...

Безопасный и компактный PHP?

Тема в разделе "PHP для новичков", создана пользователем Punk T-34, 9 авг 2012.

  1. Punk T-34

    Punk T-34 Активный пользователь

    С нами с:
    6 янв 2011
    Сообщения:
    20
    Симпатии:
    0
    Адрес:
    Украина
    Каждый раз когда я показывал свои PHP файлы другим программистам, многие из них говорили, что так нельзя писать! Это ненадёжный, незащищённый и, к тому же, очень громоздкий код...

    Небольшая предыстория:
    Я занимаюсь, в основном, созданием флеш-сайтов. Не так давно начал практиковать PHP в связке с Flash. С помощью PHP я вытаскиваю из MySQL данные и генерирую XML-файлы, которые скармливаются флеш-сайту. И наоборот: отправляю из флеша данные в PHP, чтобы он записал их в MySQL.
    И это всё зачем мне нужен PHP. Я пользуюсь небольшим стандартным набором PHP команд, которые беру из официального руководства по PHP.

    Пример одного из моих файлов:
    Код (Text):
    1. <?php
    2. header('Content-type: text/xml; Charset: UTF-8');
    3. $xmltree="<?xml version=\"1.0\" encoding=\"utf-8\"?>
    4. <xml>
    5. ";
    6. include('config.php');
    7. mysql_query('SET NAMES UTF8');
    8. $idn=$_GET['evID'];
    9.  
    10. $query="SELECT * FROM my_events WHERE id=$idn";
    11. $res=mysql_query($query);
    12. if(mysql_num_rows($res)>0)
    13.  
    14. while($data=mysql_fetch_array($res)) {
    15. $evDate=$data['date'];
    16. list($evYear, $evMonth, $evDay) = split('[-]', $evDate);
    17. $xmltree.="<ev id=\"".$data['id']."\" epoch=\"".gmmktime(0, 0, 0, $evMonth, $evDay, $evYear)."\" date=\"".$data['date']."\" titleRU=\"".$data['title_ru']."\" titleUA=\"".$data['title_ua']."\" titlePL=\"".$data['title_pl']."\" titleEN=\"".$data['title_en']."\">
    18.             <textRU><![CDATA[".$data['description_ru']."]]></textRU>
    19.             <textUA><![CDATA[".$data['description_ua']."]]></textUA>
    20.             <textPL><![CDATA[".$data['description_pl']."]]></textPL>
    21.             <textEN><![CDATA[".$data['description_en']."]]></textEN>
    22.                 <gallery>";
    23.  
    24.     $queryi="SELECT * FROM my_photos WHERE pid=$idn";
    25.     $resi=mysql_query($queryi);
    26.     while($datai=mysql_fetch_array($resi)) {
    27.     $xmltree.="<photo id=\"".$datai['id']."\" preview=\"".$datai['link_preview']."\" full=\"".$datai['link_full']."\" />";
    28.     }
    29.  
    30. $xmltree.="</gallery>
    31.         </ev>";
    32.         //$i++;
    33.         }
    34.  
    35. $xmltree.="
    36. </xml>";
    37.  
    38. echo $xmltree;
    39.  
    40. ?>
    ... И вот я не понимаю, почему мой код такой "незащищённый и громоздкий"? Хочу чтобы вы мне на пальцах объяснили, потому что я новичок в PHP.
    А также буду признателен, если покажете примеры как безопасно и не громоздко написать те же PHP-функции для доставки данных из MySQL. Например, мне может хватить одного конкретного примера связки PHP–MySQL, а дальше я уже сам попробую разобраться по аналогии.

    Заранее благодарен!
     
  2. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    SQL-инъекция
     
  3. Punk T-34

    Punk T-34 Активный пользователь

    С нами с:
    6 янв 2011
    Сообщения:
    20
    Симпатии:
    0
    Адрес:
    Украина
    Спасибо, полезная информация! Но.... это всё в данном случае?
     
  4. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Это капец, а не "всё".
     
  5. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    Punk T-34, уязвимость через инъекцию надо исправить однозначно! остальное просто "шероховатости",
    типа:
    • split('[-]', $evDate) в данном случае регулярка нафиг не нужна. будет работать и так: explode('-', $evDate) и вообще с датой у тебя какие-то мутные манипуляции. в XML должна попасть дата как UNIXTIME (целое число)? тогда логично сделать в самом запросе UNIX_TIMESTAMP(`date`) и выводить сразу результат
    • mysql_fetch_array возвращает больше, чем ты используешь. лучше замени на mysql_fetch_assoc
    • закрывающий тег ?> в последней строке признан лишним и даже опасным в некоторых случаях. просто убери!
     
  6. Колбася

    Колбася Активный пользователь

    С нами с:
    12 дек 2011
    Сообщения:
    722
    Симпатии:
    0
    А как это переписать?
    Чтоб небыло иньекции покажите примерчик :)
     
  7. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7

    Если используется int, то тогда intval()
    Код (PHP):
    1. $idn=intval($_GET['evID']); 
    и отправлять $idn как int.

    Код (PHP):
    1. $idn=$_GET['evID']; 
    Или воспользоваться в запросе.
    Код (PHP):
    1. $query="SELECT * FROM `my_events` WHERE `id`='".intval($idn)."'";
    2. $res=mysql_query($query); 

    В других случаях, пользоваться нужно mysql_real_escape_string(). желательно запросы все связать с подключением mysql_connect и сделать краткую функцию для экранирования.