我有一个使用mySQL数据库的网站,我想做一些常见的任务,例如添加用户,修改他们的信息等。我可以通过常规查询完美地做到这一点。我正在使用准备好的语句来增加安全性。
我应该使用存储过程来增加安全性还是结果相同?尽管可以使用存储过程,但我可以限制攻击者可能与真实查询之间的直接交互。我错了?

最佳答案

我想这取决于您使用哪种语言。在大多数语言中,将预备语句与包含要执行的所有sql的sql字符串一起使用,或将预备语句与将执行存储过程的sql字符串一起使用将是等效的。该语言应注意准备好的语句的安全性。例如,C#将验证输入,因此,除非您编写的语句编写得很差,以至于给它填充不好的变量(但可以预期,即1 vs 0)会极大地改变结果集,否则sql注入漏洞将大大减少。但是,其他语言可能无法提供相同级别的验证,因此,根据存储过程的确切外观,可能会有一个优势。

使用存储过程可以更好地实现可维护性,但是在很多情况下,假设程序是经过适当设计的,它就不会提供任何级别的安全性更改。我能想到的唯一示例是一个存储过程,该存储过程从用户输入中获取原始sql字符串,然后针对db执行该sql。实际上,这比使用准备好的语句安全得多,除非您花了很长时间验证可接受的输入,在这种情况下,您最好有一个很好的理由首先使用这种存储的proc。

基本上,我所说的归结为以下事实:您将需要阅读有关准备好的语句的语言文档,并确定使用准备好的语句可能存在的漏洞,以及是否有可能在特定情况下,可以通过切换到调出存储过程的预准备语句而不是直接执行sql查询来消除这种情况。

关于mysql - mySQL:存储过程比查询安全吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25790069/

10-16 22:09