问题描述
我正在尝试在 ArcGIS JavaScript API 中为 ArcGIS 图层查询构建 where
子句。我能找到的所有示例(包括在 where
documentation 中)都鼓励您这样做:
query.where = "NAME = '" + stateName + "'";
我觉得这令人惊讶,因为我们似乎被鼓励编写易受 SQL injection bugs 影响的代码。这对我来说尤其重要,因为我的“stateName”完全不在我的控制范围内。这是原始用户输入。
看起来该库支持通过 parameterValues
属性进行查询参数化,但是我找不到有关如何使用它的示例,或者如何格式化我的查询以使其使用参数值。甚至文档也不包含任何示例。
那么我们如何创建正确参数化的查询?
旁注:我知道服务器管理员的工作可能是防止错误的查询造成损害,但是我问这个问题的一半原因也纯粹是为了避免错误和不正确解析的查询。
解决方法
According to ESRI,parameterValues
属性仅用于使用查询层。它不适用于此上下文。
所以答案是,不,当您只是在图层上运行查询时,您不能使用正确的 SQL 参数化。
我发现让您的查询至少更防弹的最好方法是使用这样的代码:
function sanitizeParameter(value) {
// We need to escape single quotes to avoid messing up SQL syntax.
// So all ' characters need to become ''
return value.split("'").join("''")
}
query.where = "NAME = '" + sanitizeParameter(stateName) + "'";