STFW


Зарегистрирован: Jul 2002
Место проживания: Кольский п-ов
Публикаций: 305
Статус:  |
вот несколько функций для работы с файлами, может пригодятся.
PHP:
/**
* @return bool
* @param $filename string
* @param $relative bool
* @desc Validate filename
*/
function is_filename($filename=' ',$relative=0)
{
$allowed = '[wd]'.preg_quote("./_");
if (eregi('^WIN(.*)',PHP_OS))
$allowed .= preg_quote(':');
if ($relative && preg_match('%(..)|(/./)*%i',$filename))
return FALSE;
if (!eregi('[a-z]://(.*)',$filename))
return(!preg_match('%[^'.$allowed.'-]%i',$filename));
return FALSE;
}
/**
* @return
* @param $filename string
* @desc Check file for read access
*/
function is_readable_file($filename=' ')
{
if (is_filename($filename))
return(is_readable($filename) && is_file($filename));
}
/**
* @return bool
* @param $filename string
* @param $perms int
* @desc Create dummy file with defined permissions
*/
function file_create($filename=' ',$perms=0640)
{
if (is_filename($filename))
{
if (!file_exists($filename))
{
if (touch($filename)) return chmod($filename,$perms);
}
}
return false;
}
/**
* @return mixed
* @param $filename string
* @param $mode char
* @desc Return file descriptor if filename valid and file readable
*/
function file_open($filename=' ',$mode='r')
{
if (is_filename($filename) && is_readable($filename))
return fopen($filename, $mode);
return false;
}
/**
* @return mixed
* @param $filename string
* @desc Return contens of a file if readable
*/
function file_read($filename=' ')
{
if (is_filename($filename) && is_readable($filename))
{
$fd = file_open($filename,'r');
if ($fd)
{
$file = fread($fd, filesize($filename));
fclose($fd);
return $file;
}
}
return false;
}
/**
* @return bool
* @param $filename string
* @param $contens string
* @desc Write $contens to $filename
*/
function file_write($filename=' ',$contens='')
{
if (is_filename($filename) && is_writeable($filename) && !empty($contens))
{
$fd = file_open($filename,'w');
if ($fd)
{
if (flock($fd,LOCK_EX,TRUE))
{
set_file_buffer($fd,0);
fwrite($fd, $contens);
flock($fd,LOCK_UN);
return fclose($fd);
}
}
}
return false;
}
/**
* @return unknown
* @param $filename unknown
* @desc Delete file if valid name and permissions
*/
function file_delete($filename=' ')
{
if (is_filename($filename) && is_writeable($filename)) return unlink($filename);
}
SCHIZO добавил 17-01-2004 в 20:01:38:
еще парочка замечаний по коду
я как параноик относительно секурности и если знаю что какое то значение не должно менятся в процессе выполнения скрипта то пишу его в константу, например так:
PHP:
/ ************************************************** *************************
*
* Define most usabled constants from ENV
*
************************************************** *************************/
# Store software and protocol used both (client,server) sides
define('ENV_HTTP_CLIENT', getenv('HTTP_USER_AGENT'));
define('ENV_HTTP_SERVER', getenv('SERVER_SOFTWARE'));
# Store used protocol and method
define('ENV_HTTP_PROTOCOL', strtolower(eregi_repla ce('/(.+)$','',getenv('SERVER_PROTOCOL'))));
define('ENV_HTTP_METHOD', getenv('REQUEST_METHOD') );
# Store server machine configuration
define('ENV_SERVER_ADDR', getenv('SERVER_ADDR'));
define('ENV_SERVER_HOST', getenv('HTTP_HOST'));
define('ENV_SERVER_PORT', getenv('SERVER_PORT'));
# Store client machine configuration
define('ENV_CLIENT_ADDR', getenv('REMOTE_ADDR'));
define('ENV_CLIENT_HOST', gethostbyaddr(ENV_CLIENT _ADDR));
define('ENV_CLIENT_PORT', getenv('REMOTE_PORT'));
# Store additional request related variables
define('ENV_REQUEST_URI', getenv('REQUEST_URI'));
define('ENV_REQUEST_REFER', getenv('HTTP_REFERER' ));
define('ENV_REQUEST_STRING', getenv('QUERY_STRING' ));
define('ENV_REQUEST_COOKIES', getenv('HTTP_COOKIE' ));
# Store script path and URL related variables
define('ENV_SCRIPT_FILE', str_replace("",'/',getenv('SCRIPT_FILENAME')));
define('ENV_SCRIPT_NAME', getenv('SCRIPT_NAME'));
define('ENV_SCRIPT_DIR', dirname(ENV_SCRIPT_FILE));
define('ENV_SCRIPT_URI', sprintf('%s://%s',ENV_HTTP_PROTOCOL,ENV_SERVER_HOST.ENV_REQUEST_URI));
переменная _REQUEST не позволяет определить откуда пришли значения, с формы на твоем сайте после проверки рефера или юзер просто в адресной строке накорябал чо хотел... фантазия и настойчивость некоторых просто поражает. Ð_то особенно критично при работе с БД или файловой системой.
пример обработки запроса
PHP:
// ... этот кусок не будет работать без
// определенных констант JK_*, ENV_* и VAR_*
//которые в нем используются
/ ************************************************** *************************
*
* Low level handling request - get GPC vars
*
************************************************** *************************/
# Initialize user request vars
switch (ENV_HTTP_METHOD)
{
case (JK_ACTION_READ):
$JK_FILES = false;
if (!empty(${VAR_GET})) $JK_PARAMS =& ${VAR_GET};
break;
case (JK_ACTION_EXEC):
if (!empty(${VAR_POST})) $JK_PARAMS =& ${VAR_POST};
!empty(${VAR_FILES})
?$JK_FILES =& ${VAR_FILES}
:$JK_FILES = false;
break;
case (JK_ACTION_INFO):
$date = date('D, d F Y H:i:s').' GMT';
$header = "200 Document Followsrn";
$header .= "Last-modifed: ".$date."rnrn";
header('HTTP/1.1 '.$header);
exit();
default:
$header = "405 Method Not Allowedrn";
$header .= "Allow: GET,POST,HEAD,INFOrnrn";
header('HTTP/1.1 '.$header);
exit();
}
# initialise JK_PARAMS var if not initialize
if (empty($JK_PARAMS)) $JK_PARAMS = FALSE;
# initialize JK_COOKIES var
!empty(${VAR_COOKIE})
?$JK_COOKIE =& ${VAR_COOKIE}
:$JK_COOKIE = false;
SCHIZO добавил 17-01-2004 в 20:17:17:
и еще по стилю...
при наличии функций для работы с фалами можно использовать switch вместо многократного if
код будет смотрется гораздо логичнее
..вместо
PHP:
if ($act == 'foo') echo 'bla-bla-bla';
if ($act == 'bar') echo 'bla1-bla1-bla1';
if ($act == 'com') echo '_bla-_bla-_bla';
вот так..
PHP:
switch ($act) // обрабаотываем переменную $act
{
case ('foo'):
echo 'bla-bla-bla';
break;
case ('bar'):
echo 'bla1-bla1-bla1';
break;
case ('com'):
echo '_bla-_bla-_bla';
break;
default:
return(null);
}
SCHIZO добавил 17-01-2004 в 20:20:37:
я от вас не отстану... =)
что мы здесь видим?
PHP:
if($act=='delete') {
unlink($root.$tpl);
echo "FILE ".$tpl." DELETED ";
}
..а то что независимо от результата выполнения команды unlink все равно будет сообщено что файл удален..
..вот на такие штуки код надо проверить
SCHIZO добавил 17-01-2004 в 20:24:12:
весь HTML с переменными значениями лучше сразу запихать в переменные а потом когда надо выводить? делать это при помощи форматной строки
__________________
FAQ OFF
Сообщение было отредактировано SCHIZO 17-01-2004 в 20:09
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|