如何在获取表单上处理cHash?

时间:2019-06-27 09:12:22

标签: typo3 extbase typo3-9.x

我正在使用TYPO3 9.5,并使用extbase构建搜索扩展,并且cHash出现了一些问题。
我使用f:form在流体中构建搜索表单,并使用GET作为方法。如果我使用POST就没有问题。
我的搜索操作被配置为不可缓存的操作。我还尝试为扩展名设置TypoScript配置requireCHashArgumentForActionArguments = 0。 但是,每次尝试搜索时,都会得到一个404。即使当我让表单viewhelper生成cHash时,也是如此。唯一可行的解​​决方法是禁用LocalConfiguration中的pageNotFoundOnCHashError。但这对我来说是错的。
如果我创建带有固定搜索词的链接,该操作也将起作用。

所以我遇到了一些问题。

  • 为什么需要为不可执行的操作使用cHash?
  • cHash完全如何在表单上工作?这是用户可以修改值的形式的概念,据我所知,防止这种情况的目的是为了避免这种情况。

这也是一些示例代码

<f:form
  id="search-form"
  class="press-search-widget"
  additionalAttributes="{'role': 'search'}"
  method="get"
  action="search"
  extensionName="MySearch"
  pluginName="Mysearch"
  controller="Search"
  section="search-form" >

  <f:form.textfield
    id="pressfilter-search"
    class="form-control"
    type="text"
    name="searchTerms[searchTerm]"
    value="{parameters.searchTerm}"
    placeholder=""
  />

</f:form>

3 个答案:

答案 0 :(得分:1)

cHash是一项安全功能。它可以防止操纵参数。服务器作为附加的安全层,还可以防止缓存膨胀攻击。 机器人可以在其中生成具有新参数和TYPO3的链接,然后缓存每个此类页面的结果,并快速增长数据库中的缓存表。

但是可以使用安装工具[FE][cHashExcludedParameters]设置从该计算中排除某些参数。

那么排除的参数也不会影响缓存。 (页面将被缓存,就像没有参数一样),但是由于您具有不可缓存的操作,因此无论如何都必须即时生成结果。

答案 1 :(得分:0)

为什么需要针对不可执行的操作使用cHash?

我真的不知道。也许他们只是忘记了它,或者没有人真正使用GET表单。

cHash完全如何在表单上工作?这是用户可以修改值的形式的概念,据我了解,这是防止这种情况的追求的概念。

URL参数包含在chash中。因此,通过POST发送消息时,除了action / controller参数外,不应该使用chash。

您必须自己构建表单并手动验证或使用Javascript。 Indexed_search使用POST,更改隐藏表单字段中的页面/指针,然后再次提交该页面以进行分页。

答案 2 :(得分:0)

  

为什么要为不可执行的操作使用cHash?

在评估应提取哪个TypoScript之前先评估cHash,因此也不知道应该加载哪些(未缓存)缓存的插件,或者它们是否需要cHash评估(或将其禁用)。

  

cHash完全如何在表单上工作?这是用户可以修改值的形式的概念,据我了解,这是防止这种情况的追求的概念。

我不知道您使用HTTP GET提交表单的原因。但是,除排除的参数外,所有的GET参数都被考虑在内(请参见上面的响应)。

我强烈建议切换到HTTP POST-主要是因为HTTP标准要求不缓存POST参数(也不在浏览器中!),否则,访客A可以使用表单提交某些内容,而访客B可以看到访客A的结果POST用于数据提交,而GET实际上在HTTP中定义为“只读”模式。

TYPO3的两个选项是:

  • 如果您的用例中无需100%使用GET,请切换到POST
  • 使用TYPO3中的cHashExcludedParameters选项来禁用表单中的所有用户输入值。