我大约3到4年前开始编程,我还记得在2005年的某本PHP安全书中提到了使用mysql_insert_id来检索last_insert_id时的安全问题。
书中指出,如果同时有几个请求发送到服务器(数千个),可能会导致检索last_insert_id错误,从而将用户的id指向其他用户。
现在我们已经进入2013年了,你们对此有何看法,尤其是使用codeigniter insert_id()。
附注:我试图在其他地方找到与我的问题相关的信息,但没有找到具体的内容。
我大约3到4年前开始编程,我还记得在2005年的某本PHP安全书中提到了使用mysql_insert_id来检索last_insert_id时的安全问题。
书中指出,如果同时有几个请求发送到服务器(数千个),可能会导致检索last_insert_id错误,从而将用户的id指向其他用户。
现在我们已经进入2013年了,你们对此有何看法,尤其是使用codeigniter insert_id()。
附注:我试图在其他地方找到与我的问题相关的信息,但没有找到具体的内容。
那本书的作者充满废话。 LAST_INSERT_ID()
是特定于连接的,而连接是特定于当前脚本调用的。我想不出除了在狂欢之夜之后重新编写一些 PHP 源代码外,还有其他方式来打破这个问题。
可能,如果您正在使用持久连接,然后如果上一个连接做了插入,然后再在自己成功插入之前调用了LAST_INSERT_ID()
[您检查了返回值,对吧? ],那么可能你可能会得到一个错误的值。但是,我非常难以想象这是可能的。
只要您在执行完INSERT
后立即运行LAST_INSERT_ID()
,它总是会返回正确的值。
以下是如果您真的愿意打破它的方法:
$db_obj->insert('some data');
$db_obj->some_function_that_also_inserts_but_i_forgot_it_does_that('derp');
$id = $db_obj->last_insert_id();