求教,我在POST里面追加数据,值是我从URL获取到的值,怎么传递进去? [ 2.0 版本 ]
弄了好久都没弄到,只能抱着希望在这里请教大家了。
这是一个忘记密码的修改页面,地址栏传递了3个参数:
1,“adminuser”账号名,
2,“timestamp”时间戳,用于验证有没有超时,
3,“token”账号和时间戳MD5生成的密匙,用于验证,
所以获取地址栏上的账号名是安全的,修改账号名这链接就失效。
程序员都知道,永远不能相信用户输入的信息,所以我的activeForm里面取消了对用户名的填写,需要在POST的数据中追加,以下是我的代码,真心请教。
URL格式:http://localhost/admin/public/changeadminpassword?timestamp=1503769613&adminuser=admin&token=748c9c2990076217c8e0a0c961256446
//修改密码页面
public function actionChangeadminpassword()
{
$this->layout=false;
$model = new admin;
$model->scenario = "changeAdminPassword";
$timestamp= Yii::$app->request->get('timestamp');
$adminuser= Yii::$app->request->get('adminuser');
$token= Yii::$app->request->get('token');
$mytoken=$model->createToken($adminuser,$timestamp);
//$model->_adminuser=$adminuser;
if($token!=$mytoken || (time() - $timestamp)>300){
//$this->redirect(['public/login']);
//Yii::$app->end();
}
if(Yii::$app->request->isPost){
$post=Yii::$app->request->post();
if(!empty($post)){
$post['Admin']['adminuser']=$adminuser;//需要传递上面已经GET到的adminuser进去这里,这里在网上看了几个方法,都不行,值为NULL。
return $model->changeAdminPassword($post);
}
}
return $this->render('changeadminpassword',['model'=>$model]);
}
}
先谢谢大家,我该如何将值传进这个数组呢?
最佳答案
-
$post['Admin']['adminuser']=$adminuser
$adminuser
有值没?
$post['Admin']
这个数据存在不?共 10 条回复xiaochuanworld 回复于 2017-08-27 23:33 回复$adminuser这个在“$adminuser= Yii::$app->request->get('adminuser');”这句,有值,,
在$post['Admin']['adminuser']=$adminuser,这句里面的$adminuser变成NULL了~,我打印出来$post里面有
[adminuser:null,adminpass:123123,readminpass:123123],其中adminpass和readminpass是表单传送过来的,adminuser是$post['Admin']['adminuser']=$adminuser,这里添加的。
怎么解决呢?是作用域的问题吗?真心求教,如何才能把值传过去呢?补充:就是这个变量传不过去,,,
xiaochuanworld 回复于 2017-08-28 16:14 回复有执行的,我是采用AJAX的post提交的表单,,如果我将$post['Admin']['adminuser']=$adminuser; 里面的$adminuser改成 字符串‘admin1’,就能够打印出来数组$post['Admin']['adminuser']=‘admin1’。
@xiaochuanworld 你这是分两步执行??
你get时,
$adminuser
有值,但不会执行赋值语句(因为你的进入条件是必须是post)你post时,执行赋值语句,但
$adminuser
理因是空值,为啥?(因为你的$adminuser
是get来的,不get哪来的值)虽然你把两段语句写到一起了,但实际每次只能运行其中一个。这个值并不会保存在那里让你下次运行时读取。
明白?
xiaochuanworld 回复于 2017-08-28 20:30 回复精辟,理解到你说的了,如果要实现我的需求,有什么办法能将GET回来的值,追加到到POST上来的数据呢?全局变量这个方向可以吗?
@xiaochuanworld 全局变量是能解决问题,但也只能解决单用户的问题。当有多个用户访问时,后面的值是会覆盖前面的值。
xiaochuanworld 回复于 2017-08-30 17:14 回复@koko 这个是忘记密码后,邮箱验证里面的链接,这个页面直接改密码,由于安全原因,不能让游客POST回来账号名,不然可以通过修改这个POST 的包改到别的账号了,请问还有没有其他方法呢?
@xiaochuanworld 现在哪家的修改密码链接还需要提供账号呀。你去找几个网站修改密码试一下。
@xiaochuanworld 你不是生成了token么,就这一个就行了,还要什么自行车。
xiaochuanworld 觉得很赞
其他 7 个回答
-
你看看你的 第一个if里面打印$post,有没有进第二个if
共 1 条回复xiaochuanworld 回复于 2017-08-28 16:16 回复这个POST有进第二个IF的,因为我POST的表单有两个字段有值,就如adminpass:123123,readminpass:123123
-
你用的是post方法提交,你用$_get接受,怎么会没有问题,建议你检查这一句$post=Yii::$app->request->post();
共 2 条回复xiaochuanworld 回复于 2017-08-28 16:19 回复我用get是get浏览器地址上的参数,第一个$adminuser= Yii::$app->request->get('adminuser'),这里能拿到我想要的数据,然后我的表单是用POST提交的,POST能接收到表单的参数并且打印成功,就是我自己追加的数据里面“$post['Admin']['adminuser']=$adminuser”这句,$adminuser 这个值没有传进去,为"NULL",我把$adminuser改成字符串,就能成功追加
@xiaochuanworld 那你去判断值的类型,按你这样说就是值的类型,不符合,所以不给添加,可以把报错贴出来看下吗
-
$adminuser= Yii::$app->request->get('adminuser'); //有值
$token= Yii::$app->request->get('token');
$mytoken=$model->createToken($adminuser,$timestamp); //so排除系统因素, 值在这个方法里面应该被修改了
。。。。
$post['Admin']['adminuser']=$adminuser; //值变成了 null看了下其它回答,首先不要怀疑 get和post的混用, 这个没有任何问题。
最开始拿到值了,后面变成null,所以你只需要找到 $adminuser 这个变量在哪个地方被篡改了 就可以解决问题了
如上所述,建议检查 createToken 方法,看看是不是引用传参 ..--------------补充分割线
反复沟通后,确认了问题在于: 提交找回密码的post请求中,没有附带相关的get参数。
在这边补充备注一下,希望对碰到同类问题的phper有帮助。
有兴趣的朋友推荐了解下 http协议中 get 与 post请求的差异
就不单独回复了共 6 条回复xiaochuanworld 回复于 2017-08-28 17:25 回复$adminuser= Yii::$app->request->get('adminuser');//这个主要获取的是浏览器上的值,能够正确GET到的。
只是这个值传不去POST上来的数据里面,我想要追加post的数据,把GET到的$adminuser传过去xiaochuanworld , xyf90314 觉得很赞 -
createToken方法贴出来
共 18 条回复xiaochuanworld 回复于 2017-08-28 16:03 回复public function createToken($adminuser,$time)
{ return MD5(MD5($adminuser).base64_encode($this->getIP()).MD5($time)); }
这个没毛病的
@xiaochuanworld 如果没有地方 会篡改这个值, 那应该是你调试打印的信息有问题 ,或者 处理post请求的URL中没有相关的get参数
@xiaochuanworld 检查下表单提交页中, form 的action 对应的URL
xiaochuanworld 回复于 2017-08-28 16:23 回复@xyf90314 我取消了场景,结果一样还是NULL
xiaochuanworld 回复于 2017-08-28 16:26 回复@Jeen 我get参数的时候,没有用在ispost里面,在外面,有值,能GET到我想要的值,这个值就传不进去ispost里面,打印方法应该没问题呀,好着急~~“$post['Admin']['adminuser']=$adminuser”这句我把$adminuser改成字符串'admin',就能成功追加并打印
@xiaochuanworld 可能说的不够明白 。 你的post数据 是通过 form 提交的 还是 ajax ? 如果是 form 表单提交, 就检查下 form的action值, 为空 或者 url中包含你需要的 各个参数才行。 (可以通过浏览器查看源码,或者在视图文件里面看看)
@xiaochuanworld 把 return $this->render('changeadminpassword',['model'=>$model]); 这个对应的视图文件 changeadminpassword 源码帖出来看看
xiaochuanworld 回复于 2017-08-28 17:11 回复@Jeen 我是通过ajax提交的,现在通过‘return json_encode($post,JSON_UNESCAPED_UNICODE);’返回POST上去的数据,再在前端JAVASCRIPT里用console.log($post),打印出来的POST,所以视图文件并没有报错
@xiaochuanworld 通过ajax 提交 也需要设置一个URL, 检查下 URL 里面是否包含了 你需要的 get参数
xiaochuanworld 回复于 2017-08-28 17:20 回复这个AJAX提交地址的URL不包含账号信息的,因为操作的账号名,不能让用户有可以能改得到的地方才行,如果用户看得懂JS,修改账号名称,就可能改掉别人的密码了
@xiaochuanworld 那问题就在这边了, 因为URL里面没有 账号名, post提交时必然是取不到的。
如果担心被恶意篡改, 用户名直接通过 \Yii::$app->getUser()->getIdentity()->adminuser 就可以拿到, 这边的adminuser 对应数据库用户表中的某个字段。
不需要get 也不需要 post来传递这个参数,直接读取当前登录用户信息即可xiaochuanworld 回复于 2017-08-28 17:28 回复Yii::$app->getUser()->getIdentity()这个我知道的,可是这个是忘记密码的界面,没有登录信息的,,我没有要在POST数据里面获取用户名,本来在表单里面没有设定这个,,我想吧浏览器地址栏获取到的$adminuser,追加进去$post的数据里面
xiaochuanworld 回复于 2017-08-28 17:28 回复Yii::$app->getUser()->getIdentity()这个我知道的,可是这个是忘记密码的界面,没有登录信息的,,我没有要在POST数据里面获取用户名,本来在表单里面没有设定这个,,我想吧浏览器地址栏获取到的$adminuser,追加进去$post的数据里面
@xiaochuanworld 噢噢 忘了是,密码找回的 页面了 哈哈。
那其实你也不用担心 js 会被恶意篡改啊, adminuser 和 token 是需要绑定验证的, 不是么?
同理, 访问 密码修改页的 各个get参数都需要写到 ajax提交请求的URL里面xiaochuanworld 回复于 2017-08-28 17:37 回复@Jeen 解决方案是可以这样子,可是技术上是在YII是没能实现我的需求吗?
@xiaochuanworld 框架内似乎没有类似封装好的场景工具, 业务逻辑层面的大部分还得靠自己写
xiaochuanworld 回复于 2017-08-28 17:45 回复@Jeen 好吧,。这个问题只能绕过了,谢谢你的解答,你开个回帖吧,我采纳你
-
- 事实上按照你的流程,能够修改密码依赖于签名正确和有效期内,此时你是可以信赖adminuser这个用户名,但是需要在post操作时再次校验,(个人不推荐这种做法)
- 一般忘记密码这种流程,我都会在表中设计字段存储一个token带有效期,然后只认token,用户名也不用传了,传用户名基本没有意义。yii2 basic application 中的例子也是这么使用的。
希望对你有用。
共 1 条回复xiaochuanworld 回复于 2017-08-30 17:16 回复很好的解决方法,谢谢你的建议
xiaochuanworld
最后登录:2020-09-23
在线时长:20小时15分
- 粉丝2
- 金钱825
- 威望0
- 积分1025