Проблема с intval($_GET['id'])
1.
Дядя Саня (13.12.2009 / 16:27)
В общих чертах: Нужно что-бы при запрсе
http://сайт.com/?mod=pages&id=index по средствам include_once подключался файл pages/index.dat. Собственно проблема в том, что с любым значением id функция intval передает значение "0" и скрипт пытается открыть файл pages/0.dat. Вот код, что делать ума не приложу
:
switch ($mod) {
case 'page':
$id = ''.intval($_GET['id']).'';
include_once 'pages/'.$id.'.dat';
break;}
?>
PS. код для того, что-бы работала конструкция switch-case прописан в подключаемом файле sys/core.php.
2.
Lugaro (13.12.2009 / 16:34)
Ты вообще знаещ для чего intval?
3.
Lugaro (13.12.2009 / 16:38)
http://php.su/functions/?f=intval&choice=info
З.Ы intval тебе сдесь не нужен вообще
4.
Дядя Саня (13.12.2009 / 16:39)
2.
.::lugaro::., не очень
Просто так всегда работало, а сейчас не получается
5.
Tony V (13.12.2009 / 16:51)
4, а что ты в GET['id'] получаешь?
6.
Дядя Саня (13.12.2009 / 16:57)
5.
ЯщщЬ aka ZooM, хочу - название файла который я хочу подключить. Получается - 0
7.
Саня (13.12.2009 / 17:16)
получается потому что intval приводит значение к целочисленному типу
Если тебе для фильтрации юзай htmlspecialchars()
8.
Саня (13.12.2009 / 17:18)
<?php
switch ($mod) {
case 'page':
$id = ''.htmlspecialchars($_GET['id']).'';
include_once 'pages/'.$id.'.dat';
break;}
?>
9.
Дядя Саня (13.12.2009 / 17:36)
8.
sanzstez, благодарю!
10.
Lugaro (13.12.2009 / 17:46)
8.
sanzstez, и потоп читай любой файл
http://сайт.com/?mod=pages&id=id=../local/config
11.
Neformat (13.12.2009 / 18:02)
Ну например
if(preg_match('#[^a-z]#', $_GET['id'])) {ПНХ}
если уж на то пошло
12.
ramzes (13.12.2009 / 18:22)
Сколько помню учебников хороших и плохих в каждом жирными буквами всегда написано
не используйте конструкции типа include $_GET['var'];
Без #11 поста это дыра)).
13.
Саня (13.12.2009 / 20:25)
10, ну это уже его ошибка. я знаю что инклудить то что передается гетом плохая затея
14.
Lugaro (13.12.2009 / 20:43)
13.
sanzstez, а и я не говорю что это плохая затея, я лиш намекаю на недостаточную фильтрацию
15.
xass (13.12.2009 / 20:58)
$id = isset ( $_GET['id'] ) ? (int) $_GET['id'] : NULL;
?
16.
coca-coca (13.12.2009 / 21:01)
15.
xass, ага,с этим кодом он
обязательно прочитает index.dat xD
17.
xass (13.12.2009 / 21:02)
coca-coca (Сегодня / 21:01)
15. xass, ага,с этим кодом он обязательно прочитает index.dat xD
наверно не так понял что он хочет ...
18.
coca-coca (13.12.2009 / 21:20)
function IS_RLFI($value)
{
if($value != "" && !is_array($value))
{
$original = $value;
if(strpos($value,'.') !== FALSE)
{
if(strpos($value,"../") !== FALSE) { return TRUE; }
if(strpos($value,"://") !== FALSE) { return TRUE; }
if(strpos($value,"http") !== FALSE ||
strpos($value,'https') !== FALSE ||
strpos($value,"ftp") !== FALSE ||
strpos($value,'www') !== FALSE) { return TRUE; }
if(file_exists($value)) { return TRUE; }
}
else
{
return FALSE;
}
}
return FALSE;
}
$id = !empty($_REQUEST['id']) && IS_RLFI($_REQUEST['id']) === TRUE ? $_REQUEST['id'] ? 'index';
фильтр от RLFI хорошо работает, часто пользуюсь им)
PS, придется модифицировать под ваши нужды конечно )
19.
ramzes (13.12.2009 / 22:17)
Гг вот залили вам шелл в виде shell.gif
проку от него ни какого, а вот благодаря такой вот конструкции этот шелл становится действительно опасен если удастся его проинклудить.
До кучи можно и хитаччес проинклудить если он в папке есть и любой другой левый файл, тем самым вызвать ошибку. Вобщем не позволяйте пользователя вмешиваться в сценарий это ни чего хорошего не даст. Или хотя бы проверяйте как следует.
if($_GET['var']!='' AND preg_match('|^[a-z]+$|',$_GET['var']) AND file_exists('include/'.$_GET['var'].'.php')){
include $_GET['var'].'.php';
}
что то типа этого..
#18 всегда лучше не запрещать, а разрешать, всегда есть шанс упустить что либо в запрете.
20.
coca-coca (13.12.2009 / 22:54)
#19, если всё разрешать - то дефейс обеспечен ))
21.
Б.В. (14.12.2009 / 00:07)
Пример "разрешать" вот тут
preg_match('|^[a-z]+$|',$_GET['var'])
Разрешать не ВСЕ! А только то что нужно!
22.
Санёк (14.12.2009 / 08:54)
Надежней будет оставить код из первого поста,а название файлов сделать числовым ;)
Ну и немного изменить код...
<?php
switch ($mod) {
case 'page':
if(!empty($_GET['id'])) $id = intval($_GET['id']); else $id = 0;
if($id != 0)
include_once 'pages/'.$id.'.dat';
break;}
?>
23.
Ванек (14.12.2009 / 18:20)
<?
$id = file_exists( $_SERVER['DOCUMENT_ROOT'] . '/dir/' . $_GET['page'] ) . '.dat' ? $id : '1.dat';
$id = intval( $id ); //если в dir есть файлы [a-Z].dat
/*
case 'page':
include $_SERVER['DOCUMENT_ROOT'] . '/dir/' . $id;
break;
*/
?>
24.
Удаленный (14.12.2009 / 19:19)
<?php
switch ($mod)
{
case 'page':
preg_match ("|id=([a-z0-9]+)|", $_SERVER['QUERY_STRING'], $id);
IF(Empty($id[1]))
{
Exit();
}
ELSE
{
include_once 'pages/'.$id[1].'.dat';
}
break;
}
?>
25.
Ванек (14.12.2009 / 19:48)
* ' ) ?
Вообщем вариантов пруд пруди.
URL:
https://visavi.net/topics/3839