@muxalich
PHP, ZEND, JS, PJAX, JQ, JQ UI, MySQL

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

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

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

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

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

Спасибо, тем кто посоветовал ЦП, в эту ему и буду копать, подскажите есть ли готовые реализации ЦП ? Желательно под ZF 1.
  • Вопрос задан
  • 2664 просмотра
Решения вопроса 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
Разраб
Вам бы не экспорт сделать, а запись сохраненных товаров в отдельную таблицу бд (типа таблица предзаказа, которую можно потом подгружать и удалять, если не надо уже), тогда вы точно бы знали, что их не испортят.
Ответ написан
Ваш ответ на вопрос

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

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