我以为我会对我认为基本上消除sql注入的可能性的选项有所了解(我认为).
目前,我有我的管理员帐户,这显然让我完全掌握了数据库(更改,删除等).我有一个PHP使用的帐户只能访问SELECT,UPDATE,DELETE,INSERT.如何为每个操作设置一个用户,然后只是在MysqL_query语句中引用连接ID – 现在显然这会给服务器带来更大的压力,基本上必须进行4个连接,但是如果它的安全性是重要的是,在我看来,这将是一个有效的选项,通过将命令限制为您想要在这种情况下执行的EXACT函数.有关此选项可行性的任何想法?
更新:正如我之前没有提到的那样,这不会是阻止sql注入,MysqL_real_escape_string(),预备语句等的唯一障碍.但我只是想,如果有些人如何,所有这些都失败了,不会这样至少限制他们可以做的伤害? (例如,在注册表单上,他们将无法选择哈希值或删除条目).
这不是sql注入的全部内容.每次使用SQL查询中尚未清理的参数时,都会使数据库处于打开状态,这可能不一定会破坏数据.它也可能是窃取数据或获取未经授权的访问.
考虑一个非常受限制的帐户,它可以做的就是SELECT.您编写了一个身份验证查询:
$sql = "SELECT COUNT(*) AS count FROM users WHERE user_id='{$_POST['user']}' AND pass='{$_POST['password'}'"; // check if returns a count of 1,if yes,log in
使用正常输入,您希望查询看起来像:
SELECT COUNT(*) AS count FROM users WHERE user_id = 'username' AND pass='********'
如果用户名和传递匹配,则应该返回1作为计数.现在,攻击者尝试以管理员身份登录.由于您尚未清理输入,因此将$_POST [‘user’]发送为:admin’; – .整个查询变为:
SELECT COUNT(*) AS count FROM users WHERE user_id = 'admin'; -- AND pass='********'
之后的所有内容都是注释,因此忽略了其他条件并返回1.你去了,你刚刚授予恶意用户管理员权限.这就是一些真正的攻击的执行方式.您从低权限帐户开始,通过安全漏洞尝试获取更多权限.
长话短说,具有受限制权限的应用程序范围的帐户(例如:没有DROP,ALTER等)是好的.永远不要给任何人或任何应用程序更多的权限.但要防止sql注入,请使用prepared statements.