2017-08-27 20:19:29 7213次浏览 8条回答 0 悬赏 10 金钱

弄了好久都没弄到,只能抱着希望在这里请教大家了。
这是一个忘记密码的修改页面,地址栏传递了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]);
	}

}

先谢谢大家,我该如何将值传进这个数组呢?

最佳答案

  • koko 发布于 2017-08-27 21:10 举报
    $post['Admin']['adminuser']=$adminuser
    

    $adminuser有值没?
    $post['Admin']这个数据存在不?

    10 条回复
    回复于 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,这里添加的。
    怎么解决呢?是作用域的问题吗?真心求教,如何才能把值传过去呢?

    补充:就是这个变量传不过去,,,
    QQ图片20170827233725.png

    回复于 2017-08-28 12:33 回复

    你下边这个根本不会执行吧。
    你赋值的条件是提交数据post方式。
    但你的数据并不是post来的。

    回复于 2017-08-28 16:14 回复

    有执行的,我是采用AJAX的post提交的表单,,如果我将$post['Admin']['adminuser']=$adminuser; 里面的$adminuser改成 字符串‘admin1’,就能够打印出来数组$post['Admin']['adminuser']=‘admin1’。

    回复于 2017-08-28 20:24 回复

    你这是分两步执行??

    你get时,$adminuser有值,但不会执行赋值语句(因为你的进入条件是必须是post)

    你post时,执行赋值语句,但$adminuser理因是空值,为啥?(因为你的$adminuser是get来的,不get哪来的值)

    虽然你把两段语句写到一起了,但实际每次只能运行其中一个。这个值并不会保存在那里让你下次运行时读取。

    明白?

    回复于 2017-08-28 20:30 回复

    精辟,理解到你说的了,如果要实现我的需求,有什么办法能将GET回来的值,追加到到POST上来的数据呢?全局变量这个方向可以吗?

    回复于 2017-08-29 09:11 回复

    全局变量是能解决问题,但也只能解决单用户的问题。当有多个用户访问时,后面的值是会覆盖前面的值。

    回复于 2017-08-29 09:12 回复

    不清楚你那段代码具体做什么的,你可以提前将值传给客户端,然后post时带回来。或者在处理时临时去数据库中查询。

    回复于 2017-08-30 17:14 回复

    这个是忘记密码后,邮箱验证里面的链接,这个页面直接改密码,由于安全原因,不能让游客POST回来账号名,不然可以通过修改这个POST 的包改到别的账号了,请问还有没有其他方法呢?

    回复于 2017-08-31 15:40 回复

    现在哪家的修改密码链接还需要提供账号呀。你去找几个网站修改密码试一下。

    回复于 2017-08-31 15:41 回复

    你不是生成了token么,就这一个就行了,还要什么自行车。

    觉得很赞
  • 回答于 2017-08-28 09:01 举报

    你看看你的 第一个if里面打印$post,有没有进第二个if

    1 条回复
    回复于 2017-08-28 16:16 回复

    这个POST有进第二个IF的,因为我POST的表单有两个字段有值,就如adminpass:123123,readminpass:123123

  • 回答于 2017-08-28 09:17 举报

    你用的是post方法提交,你用$_get接受,怎么会没有问题,建议你检查这一句$post=Yii::$app->request->post();

    2 条回复
    回复于 2017-08-28 16:19 回复

    我用get是get浏览器地址上的参数,第一个$adminuser= Yii::$app->request->get('adminuser'),这里能拿到我想要的数据,然后我的表单是用POST提交的,POST能接收到表单的参数并且打印成功,就是我自己追加的数据里面“$post['Admin']['adminuser']=$adminuser”这句,$adminuser 这个值没有传进去,为"NULL",我把$adminuser改成字符串,就能成功追加

    回复于 2017-08-28 16:57 回复

    那你去判断值的类型,按你这样说就是值的类型,不符合,所以不给添加,可以把报错贴出来看下吗

  • 回答于 2017-08-28 14:55 举报

    $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 条回复
    回复于 2017-08-28 17:01 回复

    这位兄弟 你去做个表单提交,用post方法提交,用get获取我看看

    回复于 2017-08-28 17:13 回复

    对于混用表示质疑?

    <form  action="/site/test?abc=def" method="post">
            input  1
           submit
    </form>
    

    ... 然后在 actionTest 里面 dump $_GET $_POST 看看
    只要处理post请求的 目标url中指定了get参数, 就可以取到, 这个还需要怀疑?
    这边题主有问题,只能说 他哪边写错了。 get post参数不能同时使用? 不可能的。 你不妨自己试试

    回复于 2017-08-28 17:21 回复

    没说不能混用 我要说的是 你post提交 get获取不到 你这个get获取的是什么abc的值?表单的值可以获取吗

    回复于 2017-08-28 17:22 回复

    当然 题主的一开始我没仔细看 他自己标题写post的数据 然后看到里面 全是get获取 没注意url中参数已经带进去了

    回复于 2017-08-28 17:25 回复

    $adminuser= Yii::$app->request->get('adminuser');//这个主要获取的是浏览器上的值,能够正确GET到的。
    只是这个值传不去POST上来的数据里面,我想要追加post的数据,把GET到的$adminuser传过去

    回复于 2017-08-28 17:27 回复

    噢, 那就是理解的偏差了

    , 觉得很赞
  • 回答于 2017-08-28 15:36 举报

    厉害,学习了,还有这操作

  • 回答于 2017-08-28 15:42 举报

    createToken方法贴出来

    18 条回复
    回复于 2017-08-28 16:03 回复

    public function createToken($adminuser,$time)

    {
        return MD5(MD5($adminuser).base64_encode($this->getIP()).MD5($time));
    }
    

    这个没毛病的

    回复于 2017-08-28 16:12 回复

    会不会场景的影响

    回复于 2017-08-28 16:21 回复

    如果没有地方 会篡改这个值, 那应该是你调试打印的信息有问题 ,或者 处理post请求的URL中没有相关的get参数

    回复于 2017-08-28 16:22 回复

    检查下表单提交页中, form 的action 对应的URL

    回复于 2017-08-28 16:23 回复

    我取消了场景,结果一样还是NULL

    回复于 2017-08-28 16:26 回复

    我get参数的时候,没有用在ispost里面,在外面,有值,能GET到我想要的值,这个值就传不进去ispost里面,打印方法应该没问题呀,好着急~~“$post['Admin']['adminuser']=$adminuser”这句我把$adminuser改成字符串'admin',就能成功追加并打印

    回复于 2017-08-28 16:35 回复

    可能说的不够明白 。 你的post数据 是通过 form 提交的 还是 ajax ? 如果是 form 表单提交, 就检查下 form的action值, 为空 或者 url中包含你需要的 各个参数才行。 (可以通过浏览器查看源码,或者在视图文件里面看看)

    回复于 2017-08-28 16:37 回复

    把 return $this->render('changeadminpassword',['model'=>$model]); 这个对应的视图文件 changeadminpassword 源码帖出来看看

    回复于 2017-08-28 17:11 回复

    我是通过ajax提交的,现在通过‘return json_encode($post,JSON_UNESCAPED_UNICODE);’返回POST上去的数据,再在前端JAVASCRIPT里用console.log($post),打印出来的POST,所以视图文件并没有报错

    回复于 2017-08-28 17:16 回复

    通过ajax 提交 也需要设置一个URL, 检查下 URL 里面是否包含了 你需要的 get参数

    回复于 2017-08-28 17:20 回复

    这个AJAX提交地址的URL不包含账号信息的,因为操作的账号名,不能让用户有可以能改得到的地方才行,如果用户看得懂JS,修改账号名称,就可能改掉别人的密码了

    回复于 2017-08-28 17:23 回复

    那问题就在这边了, 因为URL里面没有 账号名, post提交时必然是取不到的。
    如果担心被恶意篡改, 用户名直接通过 \Yii::$app->getUser()->getIdentity()->adminuser 就可以拿到, 这边的adminuser 对应数据库用户表中的某个字段。
    不需要get 也不需要 post来传递这个参数,直接读取当前登录用户信息即可

    回复于 2017-08-28 17:28 回复

    Yii::$app->getUser()->getIdentity()这个我知道的,可是这个是忘记密码的界面,没有登录信息的,,我没有要在POST数据里面获取用户名,本来在表单里面没有设定这个,,我想吧浏览器地址栏获取到的$adminuser,追加进去$post的数据里面

    回复于 2017-08-28 17:28 回复

    Yii::$app->getUser()->getIdentity()这个我知道的,可是这个是忘记密码的界面,没有登录信息的,,我没有要在POST数据里面获取用户名,本来在表单里面没有设定这个,,我想吧浏览器地址栏获取到的$adminuser,追加进去$post的数据里面

    回复于 2017-08-28 17:32 回复

    噢噢 忘了是,密码找回的 页面了 哈哈。
    那其实你也不用担心 js 会被恶意篡改啊, adminuser 和 token 是需要绑定验证的, 不是么?
    同理, 访问 密码修改页的 各个get参数都需要写到 ajax提交请求的URL里面

    回复于 2017-08-28 17:37 回复

    解决方案是可以这样子,可是技术上是在YII是没能实现我的需求吗?

    回复于 2017-08-28 17:42 回复

    框架内似乎没有类似封装好的场景工具, 业务逻辑层面的大部分还得靠自己写

    回复于 2017-08-28 17:45 回复

    好吧,。这个问题只能绕过了,谢谢你的解答,你开个回帖吧,我采纳你

  • 回答于 2017-08-28 18:49 举报

    贴一下视图的ActiveForm的代码吧...
    估计是设置了action的地址,但没有带上get的参数
    可以把action删掉.或是带上get参数

  • 回答于 2017-08-29 00:25 举报
    1. 事实上按照你的流程,能够修改密码依赖于签名正确和有效期内,此时你是可以信赖adminuser这个用户名,但是需要在post操作时再次校验,(个人不推荐这种做法)
    2. 一般忘记密码这种流程,我都会在表中设计字段存储一个token带有效期,然后只认token,用户名也不用传了,传用户名基本没有意义。yii2 basic application 中的例子也是这么使用的。
      希望对你有用。
    1 条回复
    回复于 2017-08-30 17:16 回复

    很好的解决方法,谢谢你的建议

您需要登录后才可以回答。登录 | 立即注册
xiaochuanworld
经理

xiaochuanworld

注册时间:2017-08-27
最后登录:2020-09-23
在线时长:20小时15分
  • 粉丝2
  • 金钱825
  • 威望0
  • 积分1025

热门问题