在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 = ...
}
但是足够了吗?您是否对我有提示,如何使它更加安全?
在此先感谢您的帮助!
答案 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 = ...
}