PHP, referer и проблема с кодировкой - Форум успешных вебмастеров - GoFuckBiz.com
 
 
Форум успешных вебмастеров - GoFuckBiz.com

  Форум успешных вебмастеров - GoFuckBiz.com > Бизнес-решения > Скрипты, программы и технические решения
Дата
USD/RUB93.4409
BTC/USD64587.5967
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии.

Закрытая тема
Опции темы Опции просмотра
Старый 16.02.2012, 23:12   #1
DonGenaro
Senior Member
 
Аватар для DonGenaro
 
Регистрация: 23.02.2011
Сообщений: 1,111
Бабло: $155875
По умолчанию PHP, referer и проблема с кодировкой

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

Задача была такая: на страничке, в определённом месте, нужно выводить текст который берётся из урла, по которому к этой странице обратились. К примеру, если бы мы перешли по ссылке http:/my-lending.ru/?key=купить виагру (адрес вымышлен), на главной странице этого сайта появился бы текст(ну например в h1 заголовке) "купить виагру".

В принципе всё почти получилось, сделал страничку index.php, в нужном месте прописал примерно такой код:
<?
$ref=$_SERVER['QUERY_STRING'];
if ($ref!='') $ref='?'.$ref;
echo "Вы искали '$ref'";
?>
только всё хорошо работает если слова в урле на английском( http:/my-lending.ru/?key=buy viagra к примеру), а если на русском, то за место слов выводится набор символов А мне нужно именно под русские.

Что делать?

P.S. И подскажите заодно как обрезать первые символы у передаваемой строки, а то с помощью кода что привёл выше выводится всё включая ненужные символы ?key= . То есть если перейти по ссылке http:/my-lending.ru/?key=buy viagra, на странице выводится ?key=buy viagra, а надо просто buy viagra, короче первые 5 символов нужно вырезать. Знаю что это делается как то с помощью substr, но что то попробовал пару вариантов не получилось.
DonGenaro вне форума  
Старый 17.02.2012, 00:49   #2
chesser
автоматизирую интернеты
 
Аватар для chesser
 
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
По умолчанию

1. причем тут referer?

2. твой вариант фиксится так:
PHP код:
<?php
  $ref 
$_SERVER['QUERY_STRING'];
  
$ref substr($ref4);
  if (
$ref != '') {
    
$ref urldecode($ref);
    echo 
"Вы искали '$ref'";
  }
?>
3. но я бы решал эту задачу так:

PHP код:
<?php
  
if(isset($_GET['key']) && $_GET['key'] != '')
    echo 
"Вы искали '".urldecode($_GET['key'])."'";
?>
4. Если будешь парсить ЧПУ глянь тут: http://chesser.ru/blog/php-and-friendly-clean-urls/
__________________
USA и NL серверы и VPS | wiki | блог | Drupal | NginxТДС
Ave, Google, morituri te salutant! © chesser
chesser вне форума  
Старый 17.02.2012, 03:32   #3
mlu
Senior Member
 
Аватар для mlu
 
Регистрация: 17.02.2011
Сообщений: 153
Бабло: $26940
Отправить сообщение для mlu с помощью ICQ
По умолчанию

Цитата:
Сообщение от chesser Посмотреть сообщение
2. твой вариант фиксится так:
3. но я бы решал эту задачу так:

Во втором варианте urldecode() лишний, а еще я бы добавил на всякий случай экранирование символов/хтмл при выводе в echo(), чтобы не словить щасьтие в виде http:/my-lending.ru/?key=<script>alert(1);</script> или накрайняк http:/my-lending.ru/?key=<a href="http:/viagra.com/">buy viagra</a>
mlu вне форума  
Старый 17.02.2012, 11:03   #5
Drg
Senior Member
 
Регистрация: 19.09.2009
Сообщений: 4,096
Бабло: $611825
По умолчанию

Цитата:
Сообщение от digg Посмотреть сообщение
iconv
iconv-то тут зачем? если бы надо было из одной кодировки перекодировать в другую, то iconv.
А так все правильно вверху написали, я бы еще посоветовал вставить мета тег charset с указанием нужной кодировки.
Drg вне форума  
Старый 17.02.2012, 11:14   #6
DonGenaro
Senior Member
 
Аватар для DonGenaro
 
Регистрация: 23.02.2011
Сообщений: 1,111
Бабло: $155875
ТС -->
автор темы ТС По умолчанию

Спасибо chesser, воспользовался вот этим вариантом
PHP код:
<?php
  
if(isset($_GET['key']) && $_GET['key'] != '')
    echo 
"Вы искали '".urldecode($_GET['key'])."'";
?>

Цитата:
Сообщение от mlu Посмотреть сообщение
Во втором варианте urldecode() лишний, а еще я бы добавил на всякий случай экранирование символов/хтмл при выводе в echo(), чтобы не словить щасьтие в виде http:/my-lending.ru/?key=<script>alert(1);</script> или накрайняк http:/my-lending.ru/?key=<a href="http:/viagra.com/">buy viagra</a>
А как заэкранировать нехорошие символы? Действительно, и ссылку можно вставить на страницу и скрипт запустить... Я так понимаю нужно просто запретить вывод скобок < >, но как
DonGenaro вне форума  
Старый 17.02.2012, 11:25   #7
Drg
Senior Member
 
Регистрация: 19.09.2009
Сообщений: 4,096
Бабло: $611825
По умолчанию

Цитата:
Сообщение от DonGenaro Посмотреть сообщение
Спасибо chesser, воспользовался вот этим вариантом
PHP код:
<?php
  
if(isset($_GET['key']) && $_GET['key'] != '')
    echo 
"Вы искали '".urldecode($_GET['key'])."'";
?>



А как заэкранировать нехорошие символы? Действительно, и ссылку можно вставить на страницу и скрипт запустить... Я так понимаю нужно просто запретить вывод скобок < >, но как
Я обычно делаю так:
PHP код:
<?php
  
if(isset($_GET['key']) && $_GET['key'] != '')
if (
$_GET['key']==preg_replace('/[^\.a-zа-я0-9_-]+/is','',$_GET['key']))
    echo 
"Вы искали '".urldecode($_GET['key'])."'";
?>
т.е. я указываю какие символы разрешены, и тогда будет вывод, если символ запрещен, просто Вы искали не выведется.
Также можно использоваться экранирующие функции stripslashes, mysql_escape_string и т.д.
Drg вне форума  
Старый 17.02.2012, 11:26   #8
chesser
автоматизирую интернеты
 
Аватар для chesser
 
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
По умолчанию

mlu правильно сказал на счет ненужности urldecode, а экранировать как-нибудь так:
PHP код:
<?php
  
if(isset($_GET['key']) && $_GET['key'] != '') {
    
$key strip_tags($_GET['key']); // можно и без это строки, тогда теги будут выводиться экранированными
    
$key htmlspecialchars($key);
    echo 
"Вы искали '$key'";
  }
?>
__________________
USA и NL серверы и VPS | wiki | блог | Drupal | NginxТДС
Ave, Google, morituri te salutant! © chesser
chesser вне форума  
Старый 17.02.2012, 12:16   #9
DonGenaro
Senior Member
 
Аватар для DonGenaro
 
Регистрация: 23.02.2011
Сообщений: 1,111
Бабло: $155875
ТС -->
автор темы ТС По умолчанию

Цитата:
Сообщение от chesser Посмотреть сообщение
mlu правильно сказал на счет ненужности urldecode, а экранировать как-нибудь так:
PHP код:
<?php
  
if(isset($_GET['key']) && $_GET['key'] != '') {
    
$key strip_tags($_GET['key']); // можно и без это строки, тогда теги будут выводиться экранированными
    
$key htmlspecialchars($key);
    echo 
"Вы искали '$key'";
  }
?>
Этот код помог избавится от уязвимости, но снова начались проблемы с кодировкой. Оказалось что помогал именно urldecode и то как выяснилось не всегда. Для теста сделал две странички, одну в виндовской кодировке, другую в утф. Поставил на них ссылки типа http:/my-lending.ru/?key=купить виагру. При переходе со страницы с виндовс кодировкой, urldecode помогает, при переходе со странице в утф нет. Совсем без использования urldecode, с обеих страниц заместо русских букв набор символов. Вот жеж хрень
DonGenaro вне форума  
Старый 17.02.2012, 13:52   #10
oso
кодер
 
Аватар для oso
 
Регистрация: 21.01.2008
Сообщений: 315
Бабло: $69585
По умолчанию

для UTF вот так попробуй
PHP код:
<?php
if(isset($_GET['key']) && $_GET['key'] != '')
{
    
$key strip_tags($_GET['key']);
    
$key htmlspecialchars($key,ENT_QUOTES,'UTF-8');
    echo 
"Вы искали '$key'";
}
?>
__________________
php скрипты от $25 Отзывы: 2013-2011, 2010, 2009. acя: 384 846 ноль два шесть
oso вне форума