Я сделал умеренную функцию публикации, но я не уверен, что мой метод безопасен.
Вот контроллер
/**
* @param Request $request
* @Route ("/forum/moderate/post", name="post_moderate")
* @return Response
*/
public function moderateAction(Request $request, PostRepository $postRepository)
{
$reason = htmlentities($request->request->get('reason'));
$postId = (int)htmlentities($request->request->get('postId'));
if (empty($reason)) {
return new Response(json_encode('fail'), 500);
}
$em = $this->getDoctrine()->getManager();
$post = $postRepository->findOneBy(array('id' => $postId));
$post->setModerateReason($reason);
$em->persist($post);
$em->flush();
return new Response(json_encode('ok'), 200);
}
На данный момент нет средств безопасности.
У моей ссылки в ветке есть некоторые атрибуты: идентификатор, потому что у каждого сообщения должна быть своя собственная кнопка умеренного доступа, Data href, чтобы получить путь в файле js.Для события click также существует класс absoluteLink.
<a class="btn btn-danger btn-squared btn-sm mr-2 text-white moderateLink"
title="Modérer le commentaire" id="moderateLink-{{ post.id }}"
data-href=" {{ path('post_moderate') }}"><i class="fas fa-gavel"></i></a>
Вот мой файл post.js:
$(function () {
$('.moderateLink').on('click', moderate);
});
function moderate () {
let id = $(this).attr('id');
id = id.split('-');
id = id[1];
var reason = prompt('Entrez la raison: ');
var url = $(this).attr('data-href')
if (reason != null && reason.trim() != '') {
$.ajax({
type: "POST",
url: url,
crossDomain: false,
data: 'reason=' + reason + '&postId=' + id,
dataType: 'json',
async: false,
success: function (res) {
if (res == 'ok') {
//
}
}
});
} else if (reason != null) {
alert('Vous devez entrer une raison.');
return;
}
}
Большая проблема в том, что любой пользователь может отредактировать файл HTML, добавив необходимые атрибуты и имя класса.Я не хочу, чтобы они получили доступ к всплывающему окну.
Я пробовал что-то подобное:
Twig:
<a class="btn btn-danger btn-squared btn-sm mr-2 text-white"
title="Modérer le commentaire"
onclick="moderate({{post.id}})"><i class="fas fa-gavel"></i></a>
Post.js с FOSjsRoutingBundle (https://symfony.com/doc/master/bundles/FOSJsRoutingBundle/index.html):
const routes = require('../../public/js/fos_js_routes.json');
import Routing from '../../vendor/friendsofsymfony/jsrouting-
bundle/Resources/public/js/router.min.js';
$(function () {
moderate = function(id){
Routing.setRoutingData(routes);
var reason = prompt('Entrez la raison: ');
var url = Routing.generate('post_moderate');
if (reason != null && reason.trim() != '') {
$.ajax({
type: "POST",
url: url,
crossDomain: false,
data: 'reason=' + reason + '&postId=' + id,
dataType: 'json',
async: false,
success: function (res) {
if (res == 'ok') {
//
}
}
});
} else if (reason != null) {
alert('Vous devez entrer une raison.');
return;
}
Но в этом случае консоль подскажет, что умеренное не является определением.Если я удаляю импорт сверху, функция работает, но я не могу передать путь к js.
Я не знаю, как достичь своей цели, я хотел бы использовать свой второй метод, но я не знаю, как ...