我理解SQL注入的概念,它们是什么,它们为什么是坏的以及如何通过参数化查询和查询中断等方法来阻止它们,但是如果在代码中仅使用直接查询字符串会发生什么,在没有用户输入的地方。
例如,如果您在登录时存储了一些关于用户的内容,并且它是自动完成的,并且没有用户知道或做任何事情,可能就像这样;
UPDATE tblUser SET lastLogged = blahblah WHERE userID = blahblah2;
这是否会引起开发人员心中的任何担忧?
我的主要猜测是,如果黑客闯入某个程序或网站,或许他可以在其他攻击中进一步使用这些信息?查询/字符串是否容易被混淆?
提前干杯。
编辑:这纯粹是为了理论,所以尽量不要说“如果你要做一份工作,做得好”等等。
答案 0 :(得分:4)
在查询中使用参数时,即使参数已更改,数据库引擎也会将查询识别为相同,从而允许它使用缓存的执行计划,从而提高性能。所以,是的,总是使用参数。
关于安全性,如上所述,更新语句没有实际问题,除非用户当然可以篡改某些输入。
答案 1 :(得分:4)
如果你打算......
通过允许程序像上面定义的更新查询一样执行任意SQL,如果您的程序遭到破坏,那么您就不能再依赖于数据的完整性。
通过使用存储过程(例如SetUserLastLoggedInDate
)并拒绝对数据库执行任意SQL的权限,您可以减少在发生攻击时可能造成的损害。
答案 2 :(得分:2)
问题不在于无参数查询:它是字符串连接。所以如果你这样做:
myQuery = "UPDATE tblUser SET lastLogged = blahblah WHERE userID = " + blahblah2
你在寻找麻烦。您能完全确定blahblah2
不是来自外部来源吗?通常情况下,参数会从其他方法传递到方法中,而实际来源则是在很多类之外。其他开发人员可以在不知道后果的情况下更改这些类和源代码。
不参数化查询有什么好处?在大多数语言中都很容易做到,你养成习惯并坚持下去。
答案 3 :(得分:1)
从安全的角度来看,只要没有一个blahblah受用户控制,我就不会担心。但是从效率的角度来看,我仍然使用参数化查询。
据推测,您有多个用户需要担心,因此查询将针对不同的用户运行。参数化语句允许DBMS进行更有效的缓存。