Нативный php.Что за этим стоит?

1. lolpetyaz (31.07.2015 / 11:59)
Привет ребята,вот покопался по форумам и много где увидил,что таким способом писать нельзя,так как это небезопастно!(
Код ниже

<?
	function new_view($name,$data = null) {
		include $name.'.phtml';
	}
	
	$data['title'] = 'Тест титл';
	
	new_view('test');
	
?>


и вот код в test.phtml

<html>
	<head>
		<title><?=$data['title']?></title>
	</head>
</html>

Только один нюанс,на форумах так и не было описано почнму это не безопасно,говорили только что обязательно нужен шаблонизатор для таких дел,подскажите в чем же проблема?

2. Богдан (31.07.2015 / 13:45)
Там нет пользовательских переменных потому и опасности нет.

3. Артур (31.07.2015 / 14:59)
Вполне себе безопасный код. Микрошаблонизатор своего рода.

4. Tegos (31.07.2015 / 16:05)
Все нормально там, если нет необходимости испольновать сторонний шаблонизатор то php с этим и сам нормально справляется.

5. Вантуз-мен (31.07.2015 / 17:01)
1. lolpetyaz, прям как в 1 посте конечно небезопасно, если список файлов небольшой безопаснее всего использовать следующий пример

это актуально если name будет приходить от пользователя
<?php
function new_view($name,$data = null) { 

switch ($name) {
    case 'page1':
        include 'page1.phtml';
        break;
    case 'page2':
        include 'page2.phtml';
        break;
    case 'page3':
        include 'page3.phtml';
        break;
    default:
       echo 'Шаблон не найден';
}
    } 


6. lolpetyaz (31.07.2015 / 17:01)
4. Башка, но а как же быть с пользовательскими переменными?данными?

Добавлено через 01:05 сек.
6. Vantuz, да суть не в этом,но на заметку возьму,мне интересно почему нельзя работать с пользовательскими данными без какого либа шаблонизатора?

7. Вантуз-мен (31.07.2015 / 17:03)
7. lolpetyaz, для них проверяй через регулярку типа /[a-z0-9\-_]/i

8. lolpetyaz (31.07.2015 / 17:04)
8. Vantuz, не совсем понял,примерно как?

9. Вантуз-мен (31.07.2015 / 17:05)
7. lolpetyaz, почему нельзя, можно, или я не понимаю вопроса

10. lolpetyaz (31.07.2015 / 17:06)
10. Vantuz, ну все пишут,что это не самый безопастный код,типа надо нативный шаблонизатор для рааботы с данными!)

11. Вантуз-мен (31.07.2015 / 17:07)
если $name приходит от пользователя там могут быть символы типа ../../test.php и символ нулевого байта то есть по сути сработает конструкция типа include '../../test.php'; а не include '../../test.php.phtml'; как ты того будешь ожидать
поэтому или список или регулярное выражение

12. Артур (31.07.2015 / 18:03)
7. lolpetyaz, а речь не шла о пользовательских переменных, данных.

13. Shamsik (31.07.2015 / 19:53)
Правильно говорят все для таких вещей используют шаблонизатор,

Зачем писать Слова или HTML тэги в классах или в функциях если это можно сделать в одной отделом файле

Добавлено через 01:15 сек.
Я к примеру всегда пользовался Twig очень понятный и отличный Шаблонизатор

14. lolpetyaz (31.07.2015 / 20:54)
14. Shamsik, причем тут tpl шаблонизатор к нативноому php?Я тоже пользовался smarty и писал класс свого небольшого шаблонизатора для tpl,яя немогу понять как мне работать с нативным php и еще если с ним разобраться то никакие шаблонизаторы не дадут тебе такую скорость работы!Только вот надо понять все доконца)

Добавлено через 01:11 сек.
13. Башка, ну а что ты скажешь насчет этого?пользовательских переменных?

15. /7o/loTeH4I1k (31.07.2015 / 21:46)
15. lolpetyaz, просто фильтруй переменные которые поступают от пользователя (желательно учитывая тип) и проблем не будет.
Ну и как-то проверяй, что инклудиться будет именно нужный файл. (у меня например кэшируется список шаблонов, если подключаемого шаблона нет в списке, то он не подключится)

16. lolpetyaz (31.07.2015 / 23:18)
anonymouse (31 Июля 2015 / 21:46)
15. lolpetyaz, просто фильтруй переменные которые поступают от пользователя (желательно учитывая тип) и проблем не будет.
Ну и как-то проверяй, что инклудиться будет именно нужный файл. (у меня например кэшируется список шаблонов, если подключаемого шаблона нет в списке, то он не подключится)
Тоесть так будет все гуд?
<?php 

function new_view($name,$data = null) {
	if(file_exists($_SERVER['DOCUMENT_ROOT'].'/Views/'.$name.'.phtml')) {
		require($_SERVER['DOCUMENT_ROOT'].'/Views/'.$name.'.phtml');
	}else{
		throw new Exception('blalalal');
	}
}

$data['title'] = 'title';

$counter = $db->query('SELECT * FROM `users`')->fetch();
$data['user_id'] = $counter['id'];

new_view('test');
И вот файл test.phtml
<html>
	<head>
		<title><?=$data['title']?></title>
	</head>
<body>
   <big><?=$data['user_id']?></big>
</body>
</html>

Обьясни тогда,что под словом "Фильрируй "ты имел ввиду?а еще лучше покажи на этом примере)

17. /7o/loTeH4I1k (01.08.2015 / 10:05)
Ну смотри, условно имеется список темплейтов (или модулей, библиотек, чего угодно)
<?php
$tpls=array('head', 'foot', 'menu');
?>
В функции мы проверяем имеется ли подключаемый модуль в списке (тут я использую global, но вообще список должен получаться в самой функции, читаться из файлика или xcache например)
<?php
function new_view($name,$data = null) {
    global $tpls; // тут должно быть получение кэшированного списка
    if(in_array($name, $tpls)) { 
        require($_SERVER['DOCUMENT_ROOT'].'/Views/'.$name.'.phtml'); 
    }else{ 
        throw new Exception('blalalal'); 
    } 
}
?> 


18. Артур (01.08.2015 / 15:21)
14. lolpetyaz, ну пользовательские переменные надо фильтровать. Чти Вантуза, он писал уже о проблемах, которые могут возникать. Я мало представляю себе шаблонизатор, который на прямую берет адрес и использует его для загрузки шаблона. Обычно это делается через роутер, а роутер уже использует всякие регулярки и т.п.

URL: https://visavi.net/topics/42520