SQL存储过程是否安全?

Jav*_*ier 1 sql stored-procedures sql-injection

它们不像SQL注入那样容易受到攻击mysql_query("SELECT important_data FROM users WHERE password = $password")吗?

kem*_*002 5

它们比你正在做的更安全.您的查询是将原始SQL发布到db,这意味着您的参数不被视为sql参数,而是作为普通的旧sql.

这就是我的意思.

使用存储的prococedure,密码变量不能是sql,它必须是系统正在寻找的一条信息.在您的示例中,实际发送到数据库的是什么

SELECT*FROM用户where password =('你的密码在这里' - $密码变量).....所以有人可以做类似的事情

SELECT*FROM user WHERE Password =('您的密码在这里'; SELECT*FROM User - $ password变量).

或者更糟糕的是:

SELECT*FROM user WHERE Password =('your password here'; DROP Database Database_Name - $ password variable).

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

参数化SQL确实可以解决这个问题,但技术上存储的过程仍然更加安全,因为访问表中信息的用户不需要读取访问权限.它只需要能够执行存储过程.根据您的需要,这可能会也可能不会发挥作用.