0

我了解 SQL 注入的概念,它们是什么,它们为什么不好以及如何通过参数化查询和中断查询等方法来防止它们,但是如果您在代码中仅使用直接查询字符串会发生什么情况没有用户输入的地方。

例如,如果您在用户登录时存储了一些关于用户的信息,并且它是自动完成的,并且用户没有意识到或做任何事情,也许是这样的;

UPDATE tblUser SET lastLogged = blahblah WHERE userID = blahblah2;

这会在开发人员的脑海中引起任何担忧的威胁吗?

我的主要猜测是,如果黑客闯入程序或网站,也许他可以将这些信息进一步用于其他攻击?查询/字符串容易混淆吗?

提前喝彩。

编辑:这纯粹是为了理论,所以尽量不要说“如果你要做一份工作,就好好做”之类的说法。

4

4 回答 4

4

在查询中使用参数时,即使参数已更改,数据库引擎也会将查询识别为相同的查询,从而允许它使用缓存的执行计划,这将带来更好的性能。所以,是的,总是使用参数。

关于安全性,如上所述,更新声明没有真正的问题,除非当然某些输入可以被用户篡改。

于 2012-09-18T09:16:05.330 回答
4

如果你要做...

通过允许程序像上面定义的更新查询一样执行任意 SQL,如果您的程序曾经受到威胁,那么您就不能再依赖数据的完整性。

通过使用存储过程(例如SetUserLastLoggedInDate)并拒绝对您的数据库执行任意 SQL 的权限,您可以减轻在发生妥协时的潜在损害。

于 2012-09-18T09:20:12.573 回答
2

问题不是无参数查询:而是字符串连接。所以如果你这样做:

myQuery = "UPDATE tblUser SET lastLogged = blahblah WHERE userID = " + blahblah2

你是在自找麻烦。你能绝对确定这blahblah2不是来自外部来源吗?通常参数是从其他方法传递到方法中的,而真正的来源是在许多类之外的地方。其他开发人员可以在不知道后果的情况下更改这些类和源。

不参数化查询有什么好处?在大多数语言中,这很容易做到,你只需养成习惯并坚持下去。

于 2012-09-18T09:17:49.197 回答
1

从安全的角度来看,我不会担心,只要您的 blahblahs 都不受用户控制。但是从效率的角度来看,我仍然会使用参数化查询。

大概您要担心的用户不止一个,因此查询将为不同的用户运行。参数化语句允许 DBMS 进行更有效的缓存。

于 2012-09-18T09:17:32.023 回答