安全的MySQL查询

时间:2014-07-06 18:10:27

标签: php mysql sql security sql-injection

我正在为我的网络应用程序创建一个api,它将是开源的,用户将能够在网站上托管它,这个api用户将能够为自己的开源网站副本创建工具,下载并使用其他人的工具。对于api,我正在考虑让用户使用SQL查询数据库,例如,如果他们想要使用JavaScript api包装器获取他们正确的sql查询的名称,它将被发送到PHP文件以运行SQL查询。 出于安全目的。用户仅限于查询特定数量的表,并且每次查询时都需要密钥

我想知道这种方法是否安全,因为我不希望我的用户像SQL注入一样被黑客攻击。

2 个答案:

答案 0 :(得分:1)

不允许用户通过API提交任意SQL查询。

如果您的API允许人们提交任意SQL查询或表达式,那么它就不安全。有人可以编写一个SQL查询来读取他不应该的数据,或者以破坏数据或授予不可预见的权限的方式更新数据。或者只是进行拒绝服务攻击。

以下是针对SQL注入漏洞风险编写安全API的一些建议(设计API时还存在其他安全问题,可以肯定)。

  1. 最好的安全性是,如果API允许用户仅提交 键的值,那么您的PHP脚本将使用查询参数将该值绑定到SQL查询中在PHP代码中使用硬编码(带参数占位符)。

  2. 下一个最佳安全性是客户可以从多个SQL查询中进行选择,这些查询仍然在您的应用中进行了硬编码。客户端为他们想要使用的预先批准的查询指定一些标识符。

  3. 如果您需要允许API客户端设计自己的查询,那么下一个最好的安全性,那么您应该创建一个domain-specific language(DSL),以便您的PHP应用程序可以验证客户端是否正在提交查询你认为可以运行。另请参阅Writing Domain Specific Languages

答案 1 :(得分:1)

通过JS请求向SQL查询提供服务器脚本可能只是一个可以伪造的最不安全的想法。如果要通过任何类型的插件/扩展允许自定义数据查询,则需要创建一个HTTP数据模型,将固定请求转换为服务器上的固定查询集。这称为“ORM”,是一种常用技术 - 这里有一些PHP示例:Good PHP ORM Library?

永远不要将HTTP数据输入直接输入到服务器上的SQL调用中 - 这样的系统会随着时间的推移而被黑客入侵。