我的应用中存在一个问题,即“更改我的密码”功能已将所有用户的密码重置为相同的值。我恢复了备份,所以没有重大问题,除了这个可怕的错误,除了我自己之外没有任何错误。
显然这是由于UPDATE语句中的WHERE条件没有值。这是通过CodeIgniter中的活动记录查询。为了避免这个问题,有一个安全措施:
if( !is_numeric($userdata['client_id']) ) die('could not retrieve user ID from session');
typeof($userdata['client_id'])
告诉我这是一个“字符串”,所以我的is_numeric检查应该运行正常。 $ userdata数组来自会话。
没有user_id为0的用户,他们都有一个数字值。
我认为这可能是通过用户访问“更改密码”页面发生的,等待会话在X分钟后将其记录下来,然后提交表单。我自己尝试了这个,它只是将我重新定向到登录页面,就像它应该的那样。
我的WHERE语句尝试将$userdata['client_id']
与client_id_fk值匹配。一个或两个测试客户端的client_id_fk为NULL - 这样的测试客户端是否可以重置密码?
如果没有,我很难过。任何人吗?
答案 0 :(得分:0)
I thought this could have occurred through the user accessing the "change password" page, waiting till the session logged him out after X minutes and then submitting the form. I tried this myself and it just redirects me back to the login page, as it should.
从上面看,您似乎是在清除会话详细信息userdata后提交表单详细信息,因此userdata将无法用于密码更新查询。
此外,所有记录都会更新,因此is_numeric($userdata['client_id'])
无法正常工作。
您可以先尝试提交表单详细信息,然后注销会话吗?
答案 1 :(得分:0)
我的第一个猜测是$userdata['client_id']
是null
而is_numeric()
(误导性地)是真的吗?
答案 2 :(得分:0)
is_numeric()
返回true。假设您的client_id
字段始终是整数(应该是),那么使用is_int()
可能是个更好的主意。如果client_id
未被检索为整数(或者您正在从$_GET
读取它),那么您也可能需要考虑使用(int)
进行转换,例如:
$userdata['client_id'] = (int) $_GET['client_id'];
这应该确保您使用的值是一个整数,而不是+1e10
(在TRUE
检查中会返回is_numeric()
。
http://uk.php.net/manual/en/function.is-numeric.php
此外,您应该尝试var_dump()
您的值,而不是在查询中运行它来调试它。