вторник, 28 мая 2013 г.

javascript и get запрос

Парсер GET запросов на javascript

Проблема

Иногда возникает необходимость работать с GET запросами с помощью javascript. Очень удобно это делать предварительно разобрав запрос на пары [параметр]=>'значение' и записав их в массив. Так же необходимо учитывать, что кириллические символы, отправленные через GET запросы необходимо декодировать.

Решение с помощью функции parseGET()

Алгоритм работы

  1. Для удобства записываем GET запрос в переменную строчного типа;
  2. Создаем переменную типа массив, для хранения результатов работы нашей функции;
  3. Создаем функцию, которую назовем  parseGET;
  4. Убираем из строки запроса символ '?';
  5. Создаем вспомогательный массив вида [номер элемента]=>'параметр=значение';
  6. В цикле перебираем все элементы массива;
  7. Для каждого элемента выполняем следующие действия: создаем еще один вспомогательный массив типа [0]=>'название параметра', [1]=>'значение параметра', декодируем значение параметра и заполняем массив, который мы создали в шаге 2.

 Функция parseGET() 

//Для удобства записываем GET запрос в переменную строчного типа
var GET_query = document.location.search;

//Создаем переменную типа массив, для хранения результатов работы нашей функции
var GET=new Array();

//Создаем функцию, которую назовем  parseGET
function parseGET(){
 //Убираем из строки запроса символ '?'
 GET_query=GET_query.substr(1);
 //Создаем вспомогательный массив вида [номер элемента]=>'параметр=значение'
 var preGET=GET_query.split('&');
 //В цикле перебираем все элементы массива
 for(var i=0; i<preGET.length; i++){
  //Для каждого элемента выполняем следующие действия:
  //создаем еще один вспомогательный массив типа [0]=>'название параметра', [1]=>'значение параметра'
  var TMP_arr=preGET[i].split('=');
  var key=TMP_arr[0];
  //декодируем значение параметра
  var value=decodeURIComponent(TMP_arr[1]);
  //заполняем массив, который мы создали в шаге 2
  GET[key]=value;
 }
}

//вызываем функцию
parseGET(GET_query);

Итоги

Теперь к любому параметру отправленному на страницу с помощью GET запроса можно обратиться в javascript коде например так:

alert(GET['параметр']);

понедельник, 27 мая 2013 г.

Решаем проблему кодировок

Проблема

У большинства пользователей в настройках кодировки браузера активирована опция "Выбирать автоматически". Работая над проектом вы можете забыть указать необходимую кодировку на одной из страниц и тогда пользователь вместо информации увидит набор непонятных символов.

Решение

Создаем либо редактируем существующий файл .htaccess, он должен содержать такую вот запись :
AddDefaultCharset <название кодировки>
У меня например это выглядит так:
AddDefaultCharset UTF-8
Вот и все. Теперь обращаясь к любой странице вашего сайта браузер пользователя будет автоматически выбирать в качестве кодировки по умолчанию ту, которую вы указали в файле  .htaccess.

Защита от SQL injection и XSS (функция secureInnerData )

Защита от SQL injection и XSS

Приведенная в статье функция защищает от атак типа SQL injection и XSS

Описание

Эта простая в использовании функция поможет вам защитить себя  от атак типа SQL injection и XSS. Чаще всего их проводят используя GET или POST запросы которые не фильтруются на стороне сервера. Используя данную функцию в качестве фильтра входящих данных вы сможете частично обезопасить себя.

Исходный код функции secureInnerData 

Алгоритм предельно простой:
  1. удаляем пробелы из конца строки
  2. удаляем пробелы из начала строки
  3. преобразует специальные символы в HTML сущности
  4. возвращаем очищенные данные
//функция защищает от атак типа SQL injection и XSS
function secureInnerData($data)
{
 //удаляем пробелы из конца строки
 $data=rtrim($data);
 
 //удаляем пробелы из начала строки
 $data=ltrim($data);
 
 //преобразует специальные символы в HTML сущности
 $data=htmlspecialchars($data);
 
 //возвращаем очищенные данные
 return $data;
}

Использование функции secureInnerData 

Допустим нам надо отфильтровать параметр data который передается на сервер с помощью GET запроса. Выглядеть фильтрация будет так:

$data=secureInnerData($_GET['data']);

О реализации

rtrim(), ltrim() удаляют из конца и начала строки соответственно:
 " " (ASCII 32 (0x20)), символ пробела.
 "\t" (ASCII 9 (0x09)), символ табуляции.
 "\n" (ASCII 10 (0x0A)), символ перевода строки.
 "\r" (ASCII 13 (0x0D)), символ возврата каретки.
 "\0" (ASCII 0 (0x00)), NUL-байт.
 "\x0B" (ASCII 11 (0x0B)), вертикальная табуляция.

htmlspecialchars() преобразует специальные символы в HTML сущности:
 '&' (амперсанд) преобразуется в '&amp;'
 '"' (двойная кавычка) преобразуется в '&quot;' when ENT_NOQUOTES is not set.
 ''' (одиночная кавычка) преобразуется в '&#039;' только в режиме ENT_QUOTES.
 '<' (знак "меньше чем") преобразуется в '&lt;'
 '>' (знак "больше чем") преобразуется в '&gt;'