Безопасноть или как защитится...

Тема в разделе "PHP Pro", создана пользователем CrashX, 29 сен 2010.

Статус темы:
Закрыта.
  1. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    Тем было много, но предлагаюобсудить саму проблему не словами, а реальными примерами )
    мне кажется что важно защита от
    -XSS
    -SQL инъекций
    -shell
    --------------
    от
    XSS
    простой пример
    PHP:
      function remove_xss($string) {
        
    // Remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are allowed
        // This prevents some character re-spacing such as <java\0script>
        // Note that you have to handle splits with \n, \r, and \t later since they *are* allowed in some inputs
        
    $string preg_replace('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/'''$string);

        
    // Straight replacements, the user should never need these since they're normal characters
        // This prevents like <IMG SRC=&#X40&#X61&#X76&#X61&#X73&#X63&#X72&#X69&#X70&#X74&#X3A&#X61&#X6C&#X65&#X72&#X74&#X28&#X27&#X58&#X53&#X53&#X27&#X29>
        
    $search 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()~`";:?+/={}[]-_|\'\\';
        
    $search_count count($search);
        for (
    $i 0$i $search_count$i++) {
          
    // ;? matches the ;, which is optional
          // 0{0,7} matches any padded zeros, which are optional and go up to 8 chars
          // &#x0040 @ search for the hex values
          
    $string preg_replace('/(&#[xX]0{0,8}' dechex(ord($search[$i])) . ';?)/i'$search[$i], $string); // with a ;
          // @ @ 0{0,7} matches '0' zero to seven times
          
    $string preg_replace('/(�{0,8}' ord($search[$i]) . ';?)/'$search[$i], $string); // with a ;
        
    }

        
    // Now the only remaining whitespace attacks are \t, \n, and \r
        
    $ra = array('javascript''vbscript''expression''applet''meta''xml''blink''style',
            
    'script''embed''object''iframe''frame''frameset''ilayer''layer''bgsound',
            
    'title''link',
            
    'base',
            
    'onabort''onactivate''onafterprint''onafterupdate''onbeforeactivate''onbeforecopy',
            
    'onbeforecut''onbeforedeactivate''onbeforeeditfocus''onbeforepaste''onbeforeprint',
            
    'onbeforeunload''onbeforeupdate''onblur''onbounce''oncellchange''onchange''onclick',
            
    'oncontextmenu''oncontrolselect''oncopy''oncut''ondataavailable''ondatasetchanged',
            
    'ondatasetcomplete''ondblclick''ondeactivate''ondrag''ondragend''ondragenter',
            
    'ondragleave''ondragover''ondragstart''ondrop''onerror''onerrorupdate',
            
    'onfilterchange''onfinish''onfocus''onfocusin''onfocusout''onhelp''onkeydown',
            
    'onkeypress''onkeyup''onlayoutcomplete''onload''onlosecapture''onmousedown',
            
    'onmouseenter''onmouseleave''onmousemove''onmouseout''onmouseover''onmouseup',
            
    'onmousewheel''onmove''onmoveend''onmovestart''onpaste''onpropertychange',
            
    'onreadystatechange''onreset''onresize''onresizeend''onresizestart''onrowenter',
            
    'onrowexit''onrowsdelete''onrowsinserted''onscroll''onselect''onselectionchange',
            
    'onselectstart''onstart''onstop''onsubmit''onunload');
        
    $ra_count count($ra);

        
    $found true// Keep replacing as long as the previous round replaced something
        
    while ($found === true) {
          
    $string_before $string;
          for (
    $i 0$i $ra_count$i++) {
            
    $pattern '/';
            for (
    $j 0$j strlen($ra[$i]); $j++) {
              if (
    $j 0) {
                
    $pattern .= '((&#[xX]0{0,8}([9ab]);)||(�{0,8}([9|10|13]);))*';
              }
              
    $pattern .= $ra[$i][$j];
            }
            
    $pattern .= '/i';
            
    $replacement ''//substr($ra[$i], 0, 2).'<x>'.substr($ra[$i], 2); // add in <> to nerf the tag
            
    $string preg_replace($pattern$replacement$string); // filter out the hex tags
            
    if ($string_before == $string) {
              
    // no replacements were made, so exit the loop
              
    $found false;
            }
          }
        }
        return 
    $string;
      }
    вот у меня больше вопросы про защиту SQL,
    а именно как проверить валидный ли запрос не выполняя его или отфильтровать его так что бы все введенное воспринемалось как текст,
    чем и как лучше фильтровать входящие данные,
    наиболее часто применяемы методы для взлома...
     
  2. admLoki

    admLoki генератор случайного PHP

    Регистр.:
    14 сен 2006
    Сообщения:
    481
    Симпатии:
    93
    Повторюсь в черт знает какой раз: диспатчинг, жесткие пути, приведение типов.
    P.S. Не в обиду, но уже не в первый раз замечаю, что в PHP все проблемы с XSS именно из-за самого языка.
     
  3. horpah

    horpah

    Регистр.:
    21 июн 2010
    Сообщения:
    199
    Симпатии:
    55
    Я когда-то написал класс и теперь им пользуюсь. Принцип фильтрации таков.
    1)Запросы выполняются через метод этого класса и выглядит примерно так $DB->query_exec('SELECT * FROM table WHERE p1=?,p2=?...pn=?', переменные); Переменные - это все то что в последующем подлежит обработке. Их количество должно быть совпадать с количеством знаков ?, на места которых они поочередно подставляются будучи обработанными. Переменные могут быть массивами различной степени вложенности, важно количество элементов-немассивов
    2) Обработка. При рекурсивном обходе принятых данных определяется тип (строка или число). Строки подставляются в запрос после обработки mysql_real_escape_string и заключеия в кавычки, числа - без кавычек (например для LIMIT они не допустимы).
     
  4. admLoki

    admLoki генератор случайного PHP

    Регистр.:
    14 сен 2006
    Сообщения:
    481
    Симпатии:
    93
    Похоже на плейсхолдеры в Zend_Db. Хорошее решение.
     
    XSiteCMS нравится это.
  5. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    просто я пишу класс обработки запросов, точнее переписываю и добавляю к автоформированию запросов одну из важных для меня составляющих это конструкцию Join
    ---
    в месте с тем решил подправить и в плане безопаности

    перед попаданием в СуБД, точнее даже в текст запроса, данные проходят проверку и фильтрацию, но скажем так что нет совершенной защиты, и все можно обойти, было бы желание, так именно поэтому и подумал о защите на последнем этапе а именно формировании запроса.

    возможно стоит подумать на тему, скажем при селекте проверять были ли затроны ряды на обновлние и добавление, если были то конечно уже поздно, но зато можно запустить механизм сохранения реестра со всеми данными, и закрыть доступ к этому разделу до выяснения причин.

    а при обновлении проверять сколько рядов было обновлено если то число которое нам известно то гуд.

    это касается именно пользовательского интерфейса

    такую вещь как то раз делали, но очень криво и она ругалась на все подряд...
    ---
    про XSS, смотря примеры XSS понимаю что защиты от него нет, просто смотрю на регулярные выражения которые реально фильтруют данные, пишут xss и оно отрабатывает на ура. тут конечно кривость самой регулярки неоспорима.

    ---
    про абсолютные пути ясно, и ясно что а зпрос не вставлять данные вида $_POST['login'] =)
    ---
    возможно запрос стоит сравнивать с неким эталоном перед выполнением...

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

    а Zend_Db надо посмотреть их ревализацию.
     
  6. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    с php PDO не работал?
     
  7. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    737
    Симпатии:
    263
    Дело в том, что у PDO есть фатальный недостаток, да простят меня horpah и XSiteCMS за сравнение с Биллом Гейтсом.
     
  8. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    php PDO, поверхностно для ознакомления не более того, если быть точным то нет, тк примеры аля Привет Мир! ) не то.

    да) это недостаток, так сказать религия не позволяет)
    ну если серьезно хочется понять как защищают другие, что хорошо и что плохо, а не просто брать как обезъяна и использовать.

    Если оно действительно лучше то выбор однозначен, это так же как раеньше не понимал разницу между MySQL и MySQLi
     
Статус темы:
Закрыта.