PDA

Просмотр полной версии : Нужно сделать страницу на php


Ridikh
22.07.2008, 19:29
Нужно сделать страницу на php, чтобы все исходящие ссылки сделать локальными. На сайте есть 20 длинных ссылок и хочется заменить их.

например ссылку http://google.ru
заменить на http://yoursite.ru/out.php?1

а out.php методом GET получил бы единицу и переадресовал бы на http://google.ru

P3L3NG
22.07.2008, 19:36
содержание out.php
<?php
$link = $_GET['link'];
if ($link = 1)
{
header("Location: http://google.ru);
}
if ($link = 2)
{
header("Location: http://mail.ru);
}

...

if ($link = 20)
{
header("Location: http://new-anarchy.narod.ru);
}
?>

твоя страница html должна передавать ссыль туда в переменной link методом GET.
типа http://yoursite.ru/out.php?link=3

5triker
22.07.2008, 19:41
имхо так удобней

<?php
$location=array (
'1'=>"http://google.com",
'2'=>"http://mail.ru",
....
);
header ("Location: ".$location[$_GET['link']]);
?>


и кстати в if нада писать не = а == , закрывать " в хедере

Ridikh
22.07.2008, 19:50
спасибо вам, а можно сделать чтобы он статистику этих переходов считал?

5triker
22.07.2008, 19:56
$fw=fopen ($_GET['link'],"w+");
fputs ($fw,file_get_contents($_GET['link'])+1);


добавь

P3L3NG
22.07.2008, 19:57
можно)
сделай например...
<?php
$location=array (
'1'=>"http://google.com",
'2'=>"http://mail.ru",
....
);
header ("Location: ".$location[$_GET['link']]);
$fp = fopen("$link.txt","a+");
fwrite($fp,"0");
fclose($fp);
?>

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

чтобы вывести статистику юзай функцию:
$size = filesize($file);
echo $size;

5triker
22.07.2008, 20:00
чтобы вывести статистику юзай функцию:
PHP код:
$size = filesize($file);
echo $size;
зачем етот гемор с размером файла ?

Ridikh
22.07.2008, 20:09
$fw=fopen ($_GET['link'],"w+");
fputs ($fw,file_get_contents($_GET['link'])+1);


добавь

немного непонял код (

5triker
22.07.2008, 20:13
читает файл с именем линка прибавляет один записывает в файле получается число заходов по етому линку

<?php
$location=array (
'1'=>"http://google.com",
'2'=>"http://mail.ru",
....
);
$perehodi=file_get_contents($_GET['link'])+1;
$fw=fopen ($_GET['link'],"w+");
fputs ($fw,$perehodi);
header ("Location: ".$location[$_GET['link']]);
?>

SQLHACK
23.07.2008, 01:27
А кто нить вообще заботится о безопастности данных советов, советчики блин.
а если чел запрос сделает к произвольному файлу ?
Я так думаю этот код просто тупо затрёт любой файл на который ему хватит прав.
Продумайте код на 100%, если вы ему кого то советуете , тем более перед тем как запостить его на форуме под названием "Безопастность web-интерфейсов"

5triker
23.07.2008, 10:58
тс спросил как обезопасить етот скрипт ? или тема называется "ТОЛЬКО безопасные скрипты" ? насколько я вижу , раздел PHP,PERL,Javascript . причем сдесь то безопасен ли этот скрипт ? тс попросил пример - ему дали , дальше это его дело пользоватся им или нет , ему никто ничего не навязывает

а если нужен безопасный скрипт можно сделать так


<?php
$location=array (
'1'=>"http://google.com",
'2'=>"http://mail.ru",
....
);
$link=intval($_GET['link']);
if (array_search ($link,array_keys($location))===FALSE)
{die("неправильная ссылка");}
else
{
$perehodi=file_get_contents($_GET['link'])+1;
$fw=fopen ($_GET['link'],"w+");
fputs ($fw,$perehodi);
header ("Location: ".$location[$_GET['link']]);
}
?>

SQLHACK
23.07.2008, 11:59
И как это должно работать , сам то тестил?
Хотя бы по логике ?
То есть при линке index.php?link=1 в какой файл будет идти сохранение ?

Вообщем как то так это должно выглядеть.

<?php
$logfile = "/home/stat";
$ext=".php";
$location=array (
'1'=>"http://google.com",
'2'=>"http://mail.ru",
);
$link=intval($_GET['link']);
if (array_search ($link,array_keys($location))===FALSE)
{
die("неправильная ссылка");
}
else
{
if (is_file($logfile.$link.$ext))
{
if (is_writeable($logfile.$link.$ext))
{
$perehodi=file_get_contents($logfile.$link.$ext);
if (strlen($perehodi)>0)
{
$perehodi = intval($perehodi)+1;
}
else
{
$perehodi =1;
}
$fw=fopen ($logfile.$link.$ext,"w+");
fputs ($fw,$perehodi);
fclose ($fw);
header ("Location: ".$location[$link]);
die();
}
else
{
die("Проверьте права на запись для файла".$logfile.$link.$ext);
}
}
else
{
if (($fw=fopen ($logfile.$link.$ext,"w+"))==FALSE)
{
die("Проверьте права на запись для файла".$logfile.$link.$ext);
}
else
{
fclose ($fw);
}
}

}
?>

Doom123
23.07.2008, 12:34
SQLHACK Чувак не парься =)


$fw=fopen ($logfile.$link.$ext,"a+");
flock($fw, LOCK_EX);
$perehodi = fread($fw,filesize($logfile.$link.$ext));
if (strlen($perehodi)>0)
{
$perehodi = intval($perehodi)+1;
}
else
{
$perehodi =1;
}
ftruncate($fw, 0);
fputs ($fw,$perehodi);
fclose($fw);


Остольные проверки это на выбор (для красоты ;))

5triker
23.07.2008, 13:42
И как это должно работать , сам то тестил?
Хотя бы по логике ?
То есть при линке index.php?link=1 в какой файл будет идти сохранение ?

тестил
по логике , делает GET['link'] числом ищет в массиве location такой ключ если находит прибавляет 1 в файл , не находит die ()
сохранит в файл "1"


и зачем усложнять етим

if (strlen($perehodi)>0)
{
$perehodi = intval($perehodi)+1;
}
else
{
$perehodi =1;

если ето первый переход и файл пустой то пусто+1 то будет все равно 1

SQLHACK
23.07.2008, 14:24
я тебе про это
$fw=fopen ($_GET['link'],"w+");
а в начале он на intval проверяется, то есть если я введу 1qasd то будет создан файл 1qasd, и затирания файлов тогда не избежать, к примеру можно юзать, 1/../../../../../etc/passwd, его конечно врядли затрёшь, но это просто пример. таким образом можно затереть любой файл если прав хватит.

5triker
23.07.2008, 14:37
там я прост забыл поменять $_GET['link'] на $link