Вызов функции JS с помощью OnClick в веточку и Symfony - PullRequest
0 голосов
/ 13 марта 2019

Я сделал умеренную функцию публикации, но я не уверен, что мой метод безопасен.

Вот контроллер

/**
 * @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.

Я не знаю, как достичь своей цели, я хотел бы использовать свой второй метод, но я не знаю, как ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...