Проблема с 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. Вот код, что делать ума не приложуsad :
         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::., не оченьD
Просто так всегда работало, а сейчас не получается

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 приводит значение к целочисленному типу smile
Если тебе для фильтрации юзай 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
D наверно не так понял что он хочет ...

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