Нативный 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