PDA

Просмотр полной версии : Как определить что скрипт запущен локально


pretolock
21.05.2009, 15:50
Как сдалать проверку в PHP скрипте 1 что он запущен из скрипта 2, который находится на томже сайте
Т.е. нужно запретить запуск скрипта 1 удаленно и из других скриптов, если они используют хостинг, этого же сервера

if ($_SERVER['SERVER_ADDR'] != $_SERVER['REMOTE_ADDR'])
предотвращает только удаленный запуск

Gifts
21.05.2009, 17:01
В первом файле define('l_include',1);
Во втором первыми строками: if (!defined('l_include')) die;

pretolock
21.05.2009, 17:34
В первом файле define('l_include',1);
Во втором первыми строками: if (!defined('l_include')) die;

а что мешает воспользоваться хостингом на томже серваке и написать:
define('l_include',1);
в чужом скрипте, а потом вызвать мой скрипт который должен быть запущен локально на моем хостинге?

-=Static=-
21.05.2009, 19:22
Если ты никому не расскажешь, что у тебя константа для проверки называется "l_include" - то никто и не догадается, что надо именно ее объявить. А если уже прочли скрипт, например через file_priv в sql-inj - то тут практически никакая проверка не спасет :)

Вот еще мысль: Можно сделать проверку полного пути от корня сервера, чтоб быть уверенным что скрипт Б инклудят из скрипта в твоей папке. Например так:
<?
$docRoot = "/www/home/myfolder/public_html";
if($_SERVER["DOCUMENT_ROOT"] != $docRoot) die("You try to include my script from another fucking server");

// ...
?>

Gifts
21.05.2009, 20:41
pretolock Не позволит нормально настроенный сервер/права на файл. Если злоумышленнику удалось заинклудить/прочитать исходный текст скрипта - ни одна защита не спасет (кроме быть может самописных библиотек-расширений ПХП)

-=Static=- На переменные нельзя надеяться. Например:echo $_SERVER["DOCUMENT_ROOT"].'<hr>';
$_SERVER["DOCUMENT_ROOT"] = 'some trash dir';
echo $_SERVER["DOCUMENT_ROOT"];

eLWAux
21.05.2009, 20:47
а делов то..
if ( $_SERVER['SERVER_NAME'] == 'localhost' OR
$_SERVER['SERVER_ADDR'] == '127.0.0.1') {
print 'local run';
} else {
print 'remote run';
}

Kaimi
21.05.2009, 21:15
а делов то..

Угу, в своем скрипте перед инклудом твоего скрипта дописываешь
$_SERVER['SERVER_NAME'] = ....;
$_SERVER['SERVER_ADDR'] = ....;

И способ не работает

Gifts
21.05.2009, 21:34
eLWAux Достаточно неожиданно, но условие будет выполняться всегда ^^ Во всяком случае server_addr :D Да и вообще - зачем читать хотя бы первый пост до конца?

m0Hze
21.05.2009, 21:49
Самый оптимальный вариант - вариант Gift
только я бы еще сделал както так:


<?php

/**
* @author m0hze
* @copyright 2009
*/

$rand = rand(1,6);
define(generate_def($rand),1);
function generate_def($number)

{

$arr = array('a','b','c','d','e','f',

'g','h','i','j','k','l',

'm','n','o','p','r','s',

't','u','v','x','y','z',

'A','B','C','D','E','F',

'G','H','I','J','K','L',

'M','N','O','P','R','S',

'T','U','V','X','Y','Z',

'1','2','3','4','5','6',

'7','8','9','0','.',',',

'(',')','[',']','!','?',

'&','^','%','@','*','$',

'<','>','/','|','+','-',

'{','}','`','~');

// Генерируем пароль

$def = "";

for($i = 0; $i < $number; $i++)

{

// Вычисляем случайный индекс массива

$index = rand(0, count($arr) - 1);

$def .= $arr[$index];

}

return $def;
}

?>

Вот только неподумал, как во второй скрипт передать загенеренную константу :)
НУ может ктото другой придумает,но при таком раследе я непредставляю как ктото сможет угадать бдующую константу.

Gifts
21.05.2009, 21:54
m0Hze Зачем угадывать? Инклудим файл с генератором, инклудим интересующий файл.

Опять таки - если есть возможность читать/инклудить чужой файл - бесполезно это баловство на чистом пхп

m0Hze
21.05.2009, 22:00
ну хз, помоему во всех cms именно такая проверка,которую предложил ты.Я незнаю что еще хочет автор.Возможно можно использовать никс? Там же если я правильно помню есть несколько групп,типо www,local, ну так вот,если пользователь состоит в группе локал,определена константа,и у вызывающего тактойто ип - запускаем,если нет - гуд бай.
НУ хз,хз

pretolock
21.05.2009, 22:59
Вот только неподумал, как во второй скрипт передать загенеренную константу :)
НУ может ктото другой придумает,но при таком раследе я непредставляю как ктото сможет угадать бдующую константу.

я думаю сделать так:
- скрипт который должен запустить локальный скрипт генерирует случайное число
- записывает его в файл
- вызывает локальный скрипт и передает ему в URL'e это случайное число
- локальный скрипт сравнивает случайное число из URL'а со случайным числом прочитанным из файла
- локальный скрипт удаляет файл со случайным числом

как такая схема?

pretolock
21.05.2009, 23:16
m0Hze Зачем угадывать? Инклудим файл с генератором, инклудим интересующий файл.


добавлю еще к условию вызова, что скрипт который должен вызывать локальный скрипт запустить сложно, если его просто так вызвать)
такчто вызвать вызывающий скрипт чтобы он сгенерировал случайные данные будет проблематично

Gifts
21.05.2009, 23:48
я думаю сделать так:
- скрипт который должен запустить локальный скрипт генерирует случайное число
- записывает его в файл
- вызывает локальный скрипт и передает ему в URL'e это случайное число
- локальный скрипт сравнивает случайное число из URL'а со случайным числом прочитанным из файла
- локальный скрипт удаляет файл со случайным числом

А еще можно отрезать сервер от интернета и электричества, а потом залить бетоном. Если такая паранойя - купите вдску и будет вам счастье