@billybons2006

Как лучше для самописной CMS фильтровать данные комментариев перед выводом?

Есть сайтик, "cms" - самописная. Планирую добавить возможность добавления комментариев. Данные с формы (текст, никаких там фото или файлов) будут заноситься в базу mysql с помощью класса phpfaq.ru/safemysql в сыром, неформатированном виде. Вопрос в том, как наиболее безопасно эти данные (текст комментариев) потом выводить, чтобы не получить всяких там xss и прочего.

Раньше я делал примерно так:
$input_text = trim($input_text);
$input_text = strip_tags($input_text);
$input_text = htmlspecialchars($input_text);
$input_text = mysql_escape_string($input_text);

ну а потом уже print($input_text).

Возможно, есть либо устоявшаяся практика, как лучше/правильнее, возможно, есть уже готовый класс для этого.

Добавил сильно позднее:

Стал смотреть этот класс SafeMysql внимательнее, я что-то не понял - это ведь не PDO вовсе. Это обертка над mysqli... Меня ранее смутили постоянно в тексте класса упоминающиеся placeholders.

Например:

$name = $db->getOne('SELECT name FROM table WHERE id = ?i',$_GET['id']);

Смотрю в классе:
public function getOne()
	{
		$query = $this->prepareQuery(func_get_args());
		if ($res = $this->rawQuery($query))
		{
			$row = $this->fetch($res);
			if (is_array($row)) {
				return reset($row);
			}
			$this->free($res);
		}
		return FALSE;
	}


Смотрю код private function prepareQuery($args), а в нем просто фильтрация по типам аргументов. Что-то вроде:
...
switch ($part)
{
case '?n':
	$part = $this->escapeIdent($value);
	break;
case '?s':
	$part = $this->escapeString($value);
	break;
...
}
...


А реальное обращение к базе:

private function rawQuery($query)
{
...
$res   = mysqli_query($this->conn, $query);
...
}


Этот огород можно считать аналогом PDO или же это просто класс, использующий стареющий mysqli_query, просто с тщательной фильтрацией данных?

Добавил:

Класс safemysql - не PDO, не использует подготовленные запросы, а просто фильтрует входные данные. Класс удобный, но все же перехожу на PDO.
  • Вопрос задан
  • 243 просмотра
Пригласить эксперта
Ответы на вопрос 2
miraage
@miraage
Старый прогер
1) Работа с базой данных на низком уровне должна производиться через PDO. Мне для таких целей нравится Doctrine DBAL.

2) Экранизация вывода: htmlspecialchars($text, ENT_QUOTES, 'utf-8');

// EDIT

Вот такой подход используется в Laravel.

htmlentities($value, ENT_QUOTES, 'UTF-8', false);
Ответ написан
@dev400
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы