如何防止子句中的GET参数注入

时间:2019-11-19 15:16:55

标签: get typo3 typoscript

在TYPO3中,我创建了一些记录,并为其分配了不同的系统类别。这些类别作为GET参数传递到页面(例如:?pcat = 7)。

为防止注入,我在数据库请求的以下where子句中使用intval = 1

10 = CONTENT
    10 {
        table = tt_content
        select {

          [...]

          where {
            cObject = COA
            cObject {

               20 = TEXT
               20 {
                  data = GP:pcat
                  if.isTrue.data = GP:pcat   // only if GP is set
                  intval = 1                 // to prevent SQL-injection
                  noTrimWrap = | AND sys_category_record_mm.uid_local=| |
               }

            }

          }

          [...]

        }

        renderObj = ...

}

但是足够了吗?您是否对我有提示,如何使它更加安全?

在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

intval就足够了。这样,您可以确保它始终是一个int,并且不能仅凭一个int进行任何SQL注入。

对于非整数值,您应该使用标记,而不是将其直接从GP变量放到您的位置。 TypoScript select中的标记被转义并正确引用以防止SQL注入。有关更多信息,请参见https://docs.typo3.org/m/typo3/reference-typoscript/master/en-us/Functions/Select.html#markers

我建议始终使用标记,即使您可以使用intval来确保它的安全。如果您习惯于使用markers方法,那么您永远不会偶然忘记intval或忘记它不应该与非整数值一起使用。

您的TypoScript会变成这样:

10 = CONTENT
10 {
  table = tt_content
  select {
    [...]
    where {
      cObject = COA
      cObject {
        20 = TEXT
        20 {
          value = ###pcat###
          if.isTrue.data = GP:pcat
          noTrimWrap = | AND sys_category_record_mm.uid_local=| |
        }
      }
    }
    markers {
      pcat.data = GP:pcat
      pcat.intval = 1
    }
  }
  renderObj = ...
}