2009-06-21 113 views
1

它们比做像mysql_query("SELECT important_data FROM users WHERE password = $password")这样的东西更容易受SQL注入的影响吗?SQL存储过程是否安全?

+0

这是容易被SQL注入的CLASSIC方法 - 将东西连接在一起形成一个SQL语句并且不验证任何用户输入(例如对于$ password)。 – 2009-06-21 14:52:23

+1

是的,我认为这就是reyjavikvi所说的:使用数据库存储过程比使用示例中构造的SQL查询更安全。 – cheduardo 2009-06-21 15:04:26

回答

5

他们比你所做的更安全。您的查询将原始SQL发布到数据库,这意味着您的参数不被视为sql参数,而是作为普通的旧sql。

这是我的意思。

使用存储过程的密码变量不能是sql,它必须是系统正在查找的一条信息。在您的例子什么是真正发送到DB是

SELECT * FROM用户其中password =( '您的密码在这里' - $密码变量).....所以有人能做到像

SELECT *从用户WHERE密码=('您的密码在这里';选择*从用户 - $密码变量)。

或更糟糕的是:

SELECT * FROM用户WHERE密码=( '你的密码在这里'; DROP DATABASE DATABASE_NAME - $ password变量)。

非动态sql存储过程不会允许这样做,因为输入参数不会作为额外的sql执行。

参数化的SQL确实照顾到了这一点,但技术上存储过程仍然更安全一些,因为访问表中的信息的用户不需要读取访问权限。它只需要能够执行存储过程。根据您的需要,这可能会或可能不会发挥作用。

+0

所以基本上,使用存储过程使所有输入值不可执行,而使用原始SQL允许将数据解释为代码。得到它了。 – Green 2012-10-24 17:54:25

+0

大部分是的,你可以使用参数化的sql并在那里获得相同的好处,并且你可以编写存储过程来执行动态代码,这样你就可以撤销你从中获得的安全性,但总之是肯定的。 – kemiller2002 2012-10-24 18:09:13

0

没有安全技术。技术只能用于安全或不安全的方式。

也就是说,存储过程需要稍微更多的创意编码才能允许SQL注入 - 尽管如此。在我意识到的任何SQL数据库引擎中,没有什么能够阻止你连接字符串。

4

不一定,你可以在里面做字符串连接,并且曝光会相同。如果你使用动态sql和参数变量(没有字符串连接来产生SQL),你会得到很好的保护。

0

如果他们正确参数,你是不是在做动态SQL那么他们更安全,你也只要您使用参数,不使用字符串连接的用户受益于执行计划重用

2

输入的值,不会有SQL注入的风险。存储过程在这方面有点“更安全”,因为它们鼓励你使用参数。但是,如果在你的程序做一些像

EXECUTE 'SELECT important_data FROM users WHERE password = ' + @password 

然后你会回到原点1,并非常容易受到SQL注入。

此外,还有一种“预先准备的语句”,它不是存储过程,但也可以使用参数。因此它们可以用来避免SQL注入。