如何从根本上防止 SQL 注入?

SQL注入导致的安全问题数不胜数,为什么这么多年来同样的问题一再发生? 如果是因为SQL脚本拼接的原因,为什么不在新的实现中采用api调用的方式来杜绝漏洞? 可能是问题描述不够清晰,再补充一些吧。 楼主本人是懂得如何防止,而且参数化查询这样的方法本身也是很容易掌握的。 自己的疑问是,面对一个很容易解决,又有巨大危害的安全漏洞,靠用户(开发者也是用户)的自觉去避免,这样的机制是不是很不合理? 各大数据库厂商在自…
关注者
1673
被浏览
157571

60 个回答

根本上杜绝的方案太多太简单了,SQL注入这种攻击手段说白了和直接把门踹开偷东西一样Low,这么多年一爆再爆我也很震精。不过想想其实都是一群小白拿着几十年前的小白写的东西改改用才会这样的。

有人非说我没回答问题,OK,根本的手段就是参数化查询或者做词法分析。


@pansz 的答案的确是说到了一个关键,也就是如果支持文本式的指令,那这事儿是没有办法杜绝的,只能在外面套上一个壳,也就是词法分析。


但是现代数据库却不是只提供了SQL文本查询,参数化查询也是标准API之一,当然还有存储过程,这些高级的API都可以有效的杜绝SQL注入这种问题。在MySQL都支持存储过程的今天,还有这么多注入漏洞实在是让人费解。

不使用支持SQL的数据库过于偏颇了,几乎所有的关系型数据库都支持SQL查询,但也提供了安全的查询方式。

简单,sql injection的原因就是用户提交的参数可以入库并且当做sql结构化查询语句执行
根本办法:杜绝用户提交的参数入库并且执行
具体做法:将查询参数化或者词法分析(一楼已说)但是如果不能做到的话,建议站库分离(web服务器和数据库服务器做隔离分开)waf什么的都是扯球淡,只要心情好有时间都能绕,做cdn防护的云waf更是扯淡,秒过(具体不好吐槽,怕做云waf的大牛们喷我)
以上都是我编的,现在我编不下去了~

为什么?