MS RFC 59:向数据库连接类型添加变量绑定

作者

“小鸭”丹

联系

雅虎的丹利特

最后编辑

2010/02/20

状态

采用

版本

MAPServer 6

目的

使用MapServer、PostgreSQL和Oracle进行空间数据存储的两个主要数据库都提供了在SQL语句中“绑定”变量的能力。它们提供变量绑定的原因是为了防止需要解决SQL中的数据类型问题,并且防止SQL注入。各种MapServer应用程序从CGI请求中获取不受信任的用户输入,并将其插入到SQL语句中。这为SQL注入留下了一个开放向量。这也会导致一些问题,因为SQL需要正确地转义字符串和整数。不必提前知道这是有用的。

实施细节

需要能够以灵活的格式为各种数据库创建键值对。例如,Oracle可以使用一个命名的绑定变量,但PostgreSQL只接受数字。以下是PostgreSQL和Oracle中的变量绑定示例,以说明不同之处:

PostgreSQL::

select count(*) from parcels where city_id = $1

神谕::

select count(*) from parcels where city_id = :city_id

或者,也可以编写Oracle:

select count(*) from parcels where city_id = :1

这种对灵活性的需求很适合散列对象,在层对象中创建一个新的块来支持它可能是合适的。例如::

LAYER
        ...
        BINDVALS
                '1'  '1345'
        END
        ...
END

LAYER
        ...
        BINDVALS
                'city_id' '1345'
        END
        ...
END

向后兼容性问题

实现是完全可选的,不提供任何向后兼容性问题。

文档

主线文档将需要添加bindvals块及其功能的描述。

文件冲击

  • mapfile.c

  • mapfile.h

  • mappostgis.c

  • maporaclespatial.c

  • mapserver.h

  • maplexer.c

  • maplexer.l

评审期意见

投票历史

由PSC在面对面代码冲刺期间投票