如何在不使用隐藏表单字段的情况下将 ID 传递给控制器​​?

How to pass an ID to the Controller without using hidden form field?

假设我有以下表格,我想 post 对论坛上的主题发表评论:

<form action="{{ route('post.store') }}" method="POST">
    @csrf
    <label>Response
        <textarea name="content"></textarea>
    <label>
    <button>Post Response</button>
</form>

为了将此 post 与我正在回复的话题相关联,我还想传递我正在回复的话题的 ID。我可以像这样使用隐藏的输入字段来做到这一点:

<input type="hidden" value="{{ $thread->id }}">

我的问题是用户可以编辑 ID 的值,并最终将响应提交到论坛上的其他线程。我知道这是一个有点挑剔的问题,但这不是我希望用户能够做的事情。

我还能如何将此 ID 传递给控制器​​方法来存储 post?我可以通过会话数据传递它吗,或者我可能忽略了另一种方式。

我也不认为这是一个授权问题:经过身份验证的用户有权回复这些 posts - 如果有办法我可以使用授权对我有利的是,我很想知道,但我只是不认为它会像这样被解决。

tl;博士

您可以将实际线程 ID 存储在临时会话变量或 cookie 中。


我认为你正在错误地解决这个问题,你不应该担心用户输入的内容,而应该担心如何处理用户输入的内容。您的代码应该准备好处理任何此类绕过尝试,因此,您应该设置正确的验证/清理而不是遵循 "security through obscurity" 的理念。

通常,您会检查是否允许用户在执行任何其他验证之前对相关线程执行 CRUD 操作。

您还提到:

My issue with this is that the user can edit the value of the ID, and end up submitting the response to some other thread on the forum.

坦率地说,只要他们不执行他们不应该执行的 CRUD 操作,我就看不出有什么问题。说实话,我真的不认为它是 my 问题(作为开发人员),因为用户将输入回复并将其发布到完全不同的线程。