<rmcreative>

RSS

Все заметки с тегом «mod_rewrite»

  1. Стеганография средствами Apache и PHP

    12 июля 2006

    Из Википедии:

    Стеганография — в переводе с греческого дословно означает «тайнопись». Это наука о скрытой передаче информации путём сохранения в тайне самого факта передачи. В отличие от криптографии, которая скрывает содержимое секретного сообщения, стеганография скрывает само его существование.

    Что сделает злоумышленник, который не найдёт на сайте ни одного скрипта? Кроме как сдаться ничего и не останется...

    Итак, как же это всё реализовать?

    Первое, что нам понадобится - обработчик ошибок. Напишем его на php.

    //Файл error.php
     
      //Посылаем правильный заголовок
      header('HTTP/1.0 404 Not Found');
      //Выводим информацию для пользователя
      print('Ошибка, страница не найдена.');

    В htaccess добавим:

    [apache]
    
      ErrorDocument 404 error.php
    
    

    Теперь добавляем ко всем нашим скриптам входной get параметр mode и если он не указан или неправильно указан - запускаем наш обработчик ошибок для выдачи ошибки 404. Если же всё указано правильно - выполняем скрипт.

    //Файл index.php
     
    //Если передан параметр и подходящее значение
    if(isset($_GET['mode']) && $_GET['mode']=='display'){
        //Выполняем скрипт
        print('Результат работы скрипта');
    }
    else{
        //Иначе прикидываемся отсутствующим
        include('error.php');
    }

    Таким образом, если в адресной строке наберём

    http://www.oursite.ru/index.php
    

    получим ошибку об отсутствии такого файла на сервере.

    Для обращения к скрипту используем

    http://www.oursite.ru/index.php?mode=display
    

    Далее делаем красивые, но неудобные для злоумышленника URL, как описано в моей статье "Красивые адреса на сайте".

    Если вкратце, это делается это путём вписывания в htaccess

    [apache]
    
    RewriteEngine On 
    RewriteRule display/? index.php?mode=display
    
    

    Теперь наш скрипт доступен как

    http://www.oursite.ru/display/
    

    Далее перейдём к файлам, к которым обычно запрещают доступ (файлы паролей, данные для скриптов, конфигурация). По ним злоумышленник может определить, что за скрипт мы используем.

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

    Делается это так:

    [apache]
    
    RewriteEngine On 
    RewriteRule config/?.* error.php
    RewriteRule password.txt error.php
    
    

    Вот в принципе и всё. Надеюсь, статья поможет вам в защите ваших сайтов.

    p.s. используйте стеганографию, но не забывайте и о защите.

    1 комментарий
  2. Красивые адреса на сайте

    27 ноября 2005

    Небольшое введение.

    В последнее время стало модно делать на сайте понятные URL, т.е. не /index.php?mod=news&day=22, а /news/22/. Всё началось с нескольких больших компаний, чьи специалисты поняли, что продвинутые пользователи кроме навигации по ссылкам часто набирают адрес странички вручную. С тех пор программисты и веб-мастеры придумали множество способов достижения такой красоты. Часть их мы для начала и рассмотрим.

    Способ 1. В лоб.

    Вспомните, как обозначаются папки сайты в адресной строке. Вспомнили? Правильно. Вот так: /адрес_сайта/папка/. А теперь вспомним, что когда мы набираем адрес сайта, то на самом деле отображается файл index.html (или другой индекс), но при этом ведь в строке адреса он не указан!

    Вот вам и первый способ: создаём папку и засовываем в неё index.html.

    Теперь ваша страничка с обзором любимой книги с адресом /book.html будет доступна по адресу /book.

    Нам не пришлось дополнительно ничего писать, но зато придётся создавать кучу папок и не удастся красиво передать параметры. Будет не то, что надо, а что-то вроде /book?name=fight_club.

    Способ 2. Небольшая настройка Apache.

    Можно настроить сервер Apache так, чтобы при наборе имени файла без расширения он искал наиболее похожий файл. Таким образом, можно избежать создания папок. Необходимость в создании кучи папок отпадает, но остаётся нерешенным вопрос с передачей параметров. К тому же сервер может найти совсем не тот документ, который нужен вам.

    Способ 3. Файлы без расширения.

    Ещё один трюк - сделать исполняемыми файлы без расширения:

    
    ForceType application/x-httpd-php
    
    

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

    Способ 4. С использованием ошибок.

    Если написать в .htaccess нижеследующие строчки, то все запросы к несуществующим файлам будут отдаваться на обработку скрипту index.php.

    ErrorDocument 404 index.php
    ErrorDocument 403 index.php
    ErrorDocument 401 index.php
    

    В самом скрипте можно получить введённый адрес из переменной $REQUEST_URI, в зависимости от него выполнить нужный код. В случае получения странички необходимо послать заголовок:

    header('HTTP/1.0 200 Ok');

    На самом деле подобную обработку адреса можно прицепить ко всем вышеописанным способам, но есть одно большое но - придётся писать довольно много кода для обработки адреса, что само по себе напрягает даже опытного программиста.

    Неужели нет способа проще?

    Способ 5. Лекарство от всех бед.

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

    При написании движка RMCreative я решил, что надо использовать красивые адреса. Как представитель ленивых программистов я не хотел изобретать велосипеда и принялся искать информацию об их создании. К сожалению, все уже описанные методы (а их гораздо больше, чем привёл я в начале статьи) мне не понравились. Или много писать, или мало получишь.

    В одной из статей, написанной Дмитрием Лебедевым, рассматривались некоторые возможности модуля Apache mod_rewrite, но применялись его возможности всё по той же схеме, описанной в четвёртом способе. Я же нашел ему более рациональное и простое применение.

    Итак, что же такое этот mod_rewrite?

    mod_rewrite - модуль сервера Apache, который использует 90% всех хостингов, добавляющий возможность предварительной обработки и перенаправления запросов. Для его использования удобно воспользоваться файлом .htaccess.

    Для начала включаем модуль: RewriteEngine On

    Затем пишем правила: RewriteRule исходныйадрес адресназначения

    Когда мы обратимся по адресу http://example.com/исходный_адрес/, то на самом деле сервер обратится к http://example.com/адрес_назначения/.

    Небольшой пример
    RewriteEngine On
    
    RewriteRule news/ news.php
    RewriteRule files/book/ files.php?id=book
    
    Но это ещё не всё!

    Самая главная возможность mod_rewrite - использование регулярных выражений!

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

    Статьи про регулярные выражения:

    [Синтаксис](http://ru2.php.net/manual/ru/reference.pcre.pattern.syntax.php) [Общее описание, список функций и полезные комментарии](http://ru2.php.net/manual/ru/ref.pcre.php) [Статья Дмитрия Бородина](http://php.spb.ru/regular_expression.html)

    Допустим, мы написали скрипт, который выводит из указанного файла некую статью и вызывается из адресной строки так:

    [showarticle.php?article=programming/php/goodurl](#)
    

    Мы же хотим получить что-то вроде:

    [article/programming/php/goodurl](#)
    

    Нет проблем! Пишем в наш .htaccess:

    RewriteEngine On
    
    RewriteRule ^article/([^.]*)[/]?$ showarticle.php?article=$1
    

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

    Допустим, нам нужно вывести список новостей за 2004 год. Скрипт вызывается с параметром news.php?year=2004, но ведь можно вызвать и так news.php?year=-23. Можно обработать это в коде программы, а можно и при помощи mod_rewrite:

    RewriteEngine On
    
    RewriteRule ^news/([0-9]{4})[/]?$ news.php?year=$1
    

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

    Если мы введём что-нибудь другое, к примеру news/-23/ сервер выдаст нам ошибку 404 (не найден документ), что вполне соответствует тому, чего мы добивались.

    Заключение.

    Итак, мы изучили не требующий дополнительного кода метод создания понятных адресов, который можно применить к уже написанному на любом языке скрипту почти его не меняя. В дополнение мы узнали ещё один метод защиты скрипта от нежелательных данных.

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

    На этом всё.

    Успехов в создании удобных сайтов.

    3 комментария
  3. URL beauty with mod_rewrite

    27 ноября 2005

    Intro.

    Last years it is become a tradition to have beautiful URLs on your site, like /news/22/ and not /index.php?mod=news&day=22. The beginning of beautiful URLs is deep into major corporation portals history. Their usability specialists decided to make URLs cleaner because of people are frequently typing an URL instead of using hyperlinks. That was a good decision.

    Many URL beatifying techniques were developed by web-specialists since that. So, let's do a little overview.

    Way 1. The simplest way.

    Remember how directories are represented in URL. Got it? /site_address/dir/. Now remember that when we are typing an URL server gives us index.html (or another index) in that directory. But we weren't typed it!

    That's the first solution: create some directories to represent URLs and an index.html for each directory.

    So now we can have our page previously available at /book.html at a new URL: /book.

    No additional coding required! But… those directories… What's more we can't specify script GET parameters in a beautiful way. It will be like /book?name=fight_club.

    Way 2. Apache server settings.

    It is possible to tune up Apache so it will search some likewise files when it can't find the one specified. So the directories aren't necessary anymore… but parameters problem is still here plus we have a new problem: Apache can do some mistakes and give user a wrong file.

    Way 3. Files without extension.

    The following .htaccess trick can make files without any extension executable:

    
    ForceType application/x-httpd-php
    
    
    

    So Apache mistakes problem is solved. But we still need to pass some parameters and editing files without extension is not so handy.

    Way 4. Error redirection.

    One more trick with .htaccess file. All user queries to the files that aren't exists are redirected to index.php.

    [apache]
    
    ErrorDocument 404 index.php
    ErrorDocument 403 index.php
    ErrorDocument 401 index.php
    
    

    Now we can use $REQUEST_URI variable in our script, parse it and do something based on it.

    Tip: to get normal server reply (by default it will be 404: Not found) you must send following header in the beginning of each page:

    header('HTTP/1.0 200 Ok');

    It's a great solution in comparison with previous ones but you must write plenty of code that's not so good at all.

    Are there any solutions left?! Yes!

    Way 5. The cure-all solution.

    When I was writing first version of RMCreative engine I decided to use beautiful URLs. As a lazy programmer I used Google first to find ready to use cure-all solutions. But no solutions were really cure-all :(. With one you can do only simple things, with another you must write a lot of code…

    Then I found an article by Dmitry Lebedev, who wrote about Apache mod_rewrite module and how to do beautiful URLs with it. It is a great article but it was so much like my ways 4 with code writing…

    So, I found how to use mod_rewrite better.

    What is mod_rewrite?

    mod_rewrite is an Apache server module that is already enabled in 90% of all servers. It is adding URL preprocessing features to Apache. It's handy to use .htaccess file to specify some rewrite rules.

    First you need to turn on rewrite module: RewriteEngine On

    Then we can specify a rule: RewriteRule source (user) URL final (script) URL

    When user types http://example.com/source_URL/ server gives http://example.com/final_URL/ as a result.

    Example:

    [apache]
    
    RewriteEngine On
    
    RewriteRule news/ news.php
    RewriteRule files/book/ files.php?id=book
    
    

    But it's only a little part of mod_rewrite features!

    The main feature is that we can use regular expressions!

    If you aren't so familiar with regular expressions I recommend you to read about them first. As first sight they have no meaning at all but later you will certainly say "it's the best tool to do something with a string".

    You can find some kind of description in php manual but it's better to find some other sources.

    Ok, let's go forward.

    Let's suppose we wrote a script that displays an article specified. This script can be accessed with URL like this:

    [showarticle.php?article=programming/php/goodurl](#)
    

    This is totally bad for us. We want something like:

    [article/programming/php/goodurl](#)
    

    No problem! Open your .htaccess and write:

    [apache]
    RewriteEngine On
    
    RewriteRule ^article/([^.]*)[/]?$ showarticle.php?article=$1
    

    That's it.

    Another great mod_rewrite regular expressions feature is that we can accept only certain type of data.

    Let's assume we need to display news for year 2004. URL for this script is news.php?year=2004, but some bad guys can write something like this: news.php?year=-23. We can write some code to handle this but also we can use mod_rewrite instead:

    [apache]
    RewriteEngine On
    
    RewriteRule ^news/([0-9]{4})[/]?$ news.php?year=$1
    

    In this case we can enter only 4 digits number: news/2004/.

    Now if we try to enter news/-23/ server gives us 404 error(document not found). That's exactly what we need.

    Conclusion.

    Finally we got an URL replacing method that doesn't require a single line of code. This method can be easily applied to already written application. Additionally we got one more solution to guard our script from those "bad guys" ;)

    Perhaps, the only disadvantage of this method is that we need to learn regular expressions. But it won't be waste of time because they could be used almost everywhere to do wonderful things on strings.

    Комментировать