В моем проекте, в некоторых местах, мне нужно создать cookie через javascript. Я попытался написать очень развязанный процесс, и в итоге я получил сервис symfony:
<?php
namespace Evo\SecurityBundle\Service;
use Symfony\Component\HttpFoundation\Response;
class Cookie
{
/**
* @var
*/
protected $cookiesParams;
/**
* Constructor
*
* @param $cookiesParams
*/
public function __construct($cookiesParams)
{
$this->cookiesParams = $cookiesParams;
}
/**
* Création de cookie interne
*
* @param $name
* @param $value
* @param null $expire
* @param string $path
* @param null $domain
* @param bool $secure
* @param bool $httponly
* @return Response
*/
public function setInternalCookie($name, $value, $expire = null, $path = '/', $domain = null, $secure = false, $httponly = true)
{
$response = array();
if( isset($_COOKIE['accept-cookies']) ) {
$response['success'] = true;
$response['existed'] = true;
}
else {
$response['success'] = true;
$response['existed'] = false;
}
if( !isset($_COOKIE['accept-cookies']) ) {
if( is_null($expire) ) {
$expire = strtotime('+' . $this->cookiesParams['max_lifetime']);
}
if( is_null($domain) ) {
$domain = $_SERVER['SERVER_NAME'];
}
$cookieSet = setcookie($name, $value, $expire, $path, $domain, $secure, $httponly);
$response['success'] = $cookieSet;
$response['set'] = $cookieSet;
}
return new Response(json_encode($response));
}
}
Большую часть времени я звоню в контроллер на PHP, поэтому ничего не отображается. Но в каком-то месте мне нужно создать свой файл cookie с помощью javascript. Поэтому я написал контрольное действие, получающее параметры, и вызвал мою службу Cookie. Мой контроллер выглядит так:
<?php
namespace Evo\SecurityBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class CookieController extends Controller
{
/**
* Créé un cookie interne, via le service de Cookie
*
* @param Request $request
* @return Response
*/
public function setInternalCookieAction(Request $request)
{
try {
if(!$request->request->has('name') || !$request->request->has('value')) {
throw new \Exception('Mandatory cookie parameter missing.');
}
$cookieService = $this->container->get('security.cookie');
$response = $cookieService->setInternalCookie('accept-cookies', 1);
}
catch(\Exception $e) {
$response = new Response(json_encode(array('success' => false, 'error' => $e->getMessage())));
}
return $response;
}
}
И я называю это AJAX следующим:
// set cookie via ajax call
$.ajax({
type: "POST",
url: "/set-internal-cookie",
data: {'name': 'cookie-name', value: 'cookie-value'}
dataType: 'json'
});
С помощью этого процесса кто-то может легко найти, как создать пользовательский cookie. Это небезопасно?
Хороший процесс безопасности всегда открыт. Безопасность безвестности, хотя иногда и полезная, не считается хорошей стратегией.
Тем не менее: вы должны убедиться, что полностью подверженный влиянию emchanism все еще не может быть скомпрометирован (или не разумно, в зависимости от ваших потребностей безопасности), например, с помощью достаточно безопасного шифрования или другого процесса проверки.