我有一个使用mySQL数据库的网站,我想做一些常见的任务,比如添加用户,修改他们的信息等等。我可以通过常规查询完美地完成任务。我使用预准备语句来增加安全性。 我是否应该使用存储过程来增加安全性或结果是否相同?我虽然可能正在使用存储过程,但我可以限制可能的攻击者可能与真实查询进行的直接交互。我错了?
答案 0 :(得分:0)
我想这取决于你使用的语言。使用带有sql字符串的预准备语句,该字符串包含要执行的所有sql,或者使用带有执行存储过程的sql字符串的预准备语句将在大多数语言中大致相同。语言应该处理准备好的语句周围的安全性。例如,C#将验证输入,因此sql注入漏洞会大大减少,除非你准备好的语句编写得太差,以至于输入错误(但预期,即1对0)变量将极大地改变结果集。其他语言可能无法提供相同级别的验证,因此可能有一个优势,具体取决于您的存储过程的确切内容。
使用存储过程对于可维护性更好,但是假设程序设计正确,并没有很多场景可以提供安全级别的任何变化。我能想到的唯一一个例子就是一个存储过程,它从用户输入中获取原始sql字符串,然后针对db执行该sql。这实际上不如使用预准备语句那么安全,除非你花了很大力气来验证可接受的输入,在这种情况下,你最好有一个非常好的理由首先使用这样的存储过程。
基本上,我所说的归结为这样一个事实,即您需要阅读有关预准备语句的语言文档,并确定使用预准备语句可能具有的漏洞(如果有),以及是否通过切换到调用存储过程而不是直接执行sql查询的预准备语句,可以在特定方案中消除这些。
答案 1 :(得分:0)
结果将是相同的(假设您正确设置存储过程)。
似乎有很好的写作here。虽然我绝不会建议你自己试图逃避用户输入。 (他们将此视为选项3)