Задать вопрос
@muxalich
PHP, ZEND, JS, PJAX, JQ, JQ UI, MySQL

Как защитить файл, с serialize содержимым?

Здравствуйте, у меня на сайте реализован метод экспорта товара, в файл просто записываются serialize данные из бд. Затем по этим же данным восстанавливается. Вопрос как можно защитить файл от внешнего вмешательства ? Чтобы быть уверенным, что с файлом не 'химичили' ?

Есть идея шифровать содержимое файла. Но в том ли я направлении смотрю ?

Забыл добавить, файл содержит base64 - фото товара, в общем-то и боюсь, что нахимичат именно с представлением файла, например заменят его на вредоносный php файл.

Подробнее: экспорт товара - любой пользователь может сохранять свои товары к себе на компьютер в виде файла. Что подразумевает из себя файл ? serialize(base64( фото товара) + данные товара). Затем после сохранения эти товары могут быть импортированы назад, путем обратных преобразований. Делается это на экстренный случай, так как у людей по несколько тысяч различных товаров, и в случае чп пользователь сам может восстановить их из файла, не дожидаясь ответа администрации.

Спасибо, тем кто посоветовал ЦП, в эту ему и буду копать, подскажите есть ли готовые реализации ЦП ? Желательно под ZF 1.
  • Вопрос задан
  • 2671 просмотр
Подписаться 2 Оценить 1 комментарий
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 3
nmk2002
@nmk2002
работаю в ИБ
Скорее всего вас должна интересовать подпись файла, а не шифрование.
Подпись обеспечит целостность. Если подпись не верна, то содержимое меняли.
Ответ написан
если без хранения файла на стороне клиента никак не обойтись, то направление верное
в вашем случае файл можно либо шифровать, либо подписывать, например к сохраняемым данным добавить вычисленный хэш код данных, чтобы убедиться, что данные не были изменены
разумеется следует добавить соль и использовать алгоритм, который нельзя (без знания соли и т.п.) воспроизвести на стороне клиента
Ответ написан
saksmt
@saksmt
PHP-developer, Backend
<?php

class BrokenSignException extends \Exception {}

class ExportableData
{
	protected static function getCost()
	{
		return 13;
	}

	private $data;
	private $filename;

	/**
	 * Constructor from data
	 * @param mixed $data Data to save
	 */
	public function __construct($data)
	{
		$this->data = $data;
	}

	/**
	 * Exports data to specified file
	 * @param string $filename Filename
	 */
	public function export($filename)
	{
		$this->filename = $filename;
		$this->save($this->exportToString());
	}

	/**
	 * Export data to string
	 * @return string Exported data
	 */
	public function exportToString()
	{
		return serialize($this->sign());
	}

	/**
	 * Import signed data from string
	 * @param string $data Signed data
	 * @return ExportableData Instance of @a ExportableData
	 * @throws BrokenSignException If sign verification failed
	 */
	public static function importFromString($data)
	{
		$me = new static(null);
		$me->verify(unserialize($data));
		return $me;
	}

	/**
	 * Data getter
	 * @return mixed User data
	 */
	public function getData()
	{
		return $this->data;
	}

	/**
	 * Import signed data from specified file
	 * @param string $filename Filename
	 * @return ExportableData Instance of @a ExportableData with data from file
	 * @throws BrokenSignException If sign verification failed
	 */
	public static function import($filename)
	{
		$me = new static(null);
		$me->filename = $filename;
		$me->verify($me->load());
		return $me;
	}

	protected load()
	{
		return unserialize(file_get_contents($this->filename));
	}

	protected function verify(array $rawData)
	{
		if (!password_verify($rawData[0], $rawData[1])) {
			throw new BrokenSignException();
		}
		$this->data = unserialize(base64_decode($rawData[1]));
	}

	protected function sign()
	{
		$serialized = base64_encode(serialize($this->data));
		$sign = password_hash($serialized, PASSWORD_BCRYPT, ['cost' => static::getCost()]);
		return [$serialized, $sign];
	}

	protected function save($rawData)
	{
		file_put_contents($this->filename, $rawData);
	}
}

// Example

// Saving

/** @var mixed $product */
$exportable = new ExportableData($product);
$exportable->export('somefile.sav');
// Or if you want to get file as string
$exportable->exportToString();

// Loading

$data = null;
try {
	// if you got file as string
	$data = ExportableData::importFromString($stringData);
	// if you got file
	$data = ExportableData::import($filename);
} catch (BrokenSignException $e) {
	die('Data is broken!');
}
$product = $data->getData();
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
FanatPHP
@FanatPHP
Чебуратор тега РНР
Все ответы не стоят одного комментария от Армянское Радио
Что вы понимаете под "химичили" и куда в дальнейшем направляется файл?

До получения ответа на который ни одного ответа написано быть не должно.

Одна из вещей, которая отличает обезьянку от специалиста - это наличие опыта. И выработанная интуиция на говнокод. Если человек спрашивает, как ему приделать к велосипеду квадратные колеса, причем отдельно оговаривает, что цвет велосипеда красный - это однозначно говорит о том, что в голове у него винегрет, и он что-то изначально делает неправильно. поэтому надо сначала спросить его - ЗАЧЕМ ему валосипед с квадратными колесами.
А потом объяснить, как делать правильно.
Ответ написан
65536
@65536
внешнего вмешательства откуда? если по хттп, то положить в папку рядом с ним .htaccess с содержимим Deny From All
Ответ написан
Комментировать
Applez
@Applez
Разраб
Вам бы не экспорт сделать, а запись сохраненных товаров в отдельную таблицу бд (типа таблица предзаказа, которую можно потом подгружать и удалять, если не надо уже), тогда вы точно бы знали, что их не испортят.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽