|
| Дата |
|
USD/RUB | 93.4409 | BTC/USD | 64587.5967 |
|
|
|
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии. |
16.02.2012, 23:12
|
#1
|
Senior Member
Регистрация: 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, но что то попробовал пару вариантов не получилось.
|
|
|
17.02.2012, 00:49
|
#2
|
автоматизирую интернеты
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
|
1. причем тут referer?
2. твой вариант фиксится так:
PHP код:
<?php
$ref = $_SERVER['QUERY_STRING'];
$ref = substr($ref, 4);
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/
|
|
|
17.02.2012, 03:32
|
#3
|
Senior Member
Регистрация: 17.02.2011
Сообщений: 153
Бабло: $26940
|
Цитата:
Сообщение от 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>
|
|
|
17.02.2012, 10:11
|
#4
|
$400
Регистрация: 17.05.2009
Сообщений: 13,949
Бабло: $1895470
|
iconv
|
|
|
17.02.2012, 11:03
|
#5
|
Senior Member
Регистрация: 19.09.2009
Сообщений: 4,096
Бабло: $611825
|
Цитата:
Сообщение от digg
iconv
|
iconv-то тут зачем? если бы надо было из одной кодировки перекодировать в другую, то iconv.
А так все правильно вверху написали, я бы еще посоветовал вставить мета тег charset с указанием нужной кодировки.
|
|
|
17.02.2012, 11:14
|
#6
|
Senior Member
Регистрация: 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>
|
А как заэкранировать нехорошие символы? Действительно, и ссылку можно вставить на страницу и скрипт запустить... Я так понимаю нужно просто запретить вывод скобок < >, но как
|
|
|
17.02.2012, 11:25
|
#7
|
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 и т.д.
|
|
|
17.02.2012, 11:26
|
#8
|
автоматизирую интернеты
Регистрация: 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'"; } ?>
|
|
|
17.02.2012, 12:16
|
#9
|
Senior Member
Регистрация: 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, с обеих страниц заместо русских букв набор символов. Вот жеж хрень
|
|
|
17.02.2012, 13:52
|
#10
|
кодер
Регистрация: 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 ноль два шесть
|
|
|
|