如何解决Rails 自行向请求添加未经许可的参数
我有一个与 Rails 6 API 通信的 Vue 应用程序。我注意到在我的某些端点中出现了一些奇怪的行为,其中 Rails 接收到一些看似从未真正从前端发送过的参数,就好像 Rails 只是自己注入它们一样。这不是一个大问题,因为无论如何这些参数最终都会被拒绝并且允许的参数工作正常,但我很好奇到底发生了什么。
例如,我在前端的登录方法将使用包含 /authenticate
和 username
的 JSON 调用 password
端点。正如您在下面的屏幕截图中看到的,这是发送到 Rails 的整个请求负载。
但在 Rails 日志中,每次发出此请求时,我都会看到以 user => { username: "dummy" }
形式显示的额外的未经许可的参数。
我的 authenticate
控制器方法非常简单
def authenticate
@user = User.find_by(username: user_params[:username])
if @user&.authenticate(params[:password])
token = JsonWebToken.encode(user_id: @user.id)
render json: { token: token,user: @user },status: :ok
else
render json: { error: 'Invalid username or password,please try again' },status: :unauthorized
end
end
def user_params
params.permit(:username,:password,:email)
end
这里到底发生了什么?
解决方法
这些被称为包装参数并由控制器级别的导轨插入
https://api.rubyonrails.org/v6.0.0/classes/ActionController/ParamsWrapper.html
将参数散列包装成嵌套散列。这将允许客户端提交请求而无需指定任何根元素。
您可以通过将这个 using UnityEngine;
public class CreatureActivity : MonoBehaviour
{
float sense = 2;
float speed = .05f;
LayerMask LayerMask = 8;
private void Start()
{
Physics2D.queriesStartInColliders = false;
}
// Update is called once per frame
void FixedUpdate()
{
Vector2 position = new Vector2(transform.position.x,transform.position.y);
Vector2 right = new Vector2(position.x + 1,position.y);
Vector2 left = new Vector2(position.x - 1,position.y);
Vector2 up = new Vector2(position.x,position.y + 1);
Vector2 down = new Vector2(position.x,position.y - 1);
RaycastHit2D hitInfoR = Physics2D.Raycast(position,right,sense);
RaycastHit2D hitInfoL = Physics2D.Raycast(position,left,sense);
RaycastHit2D hitInfoU = Physics2D.Raycast(position,up,sense);
RaycastHit2D hitInfoD = Physics2D.Raycast(position,down,sense);
//right ray
if (hitInfoR.collider != null)
{
transform.position = Vector2.MoveTowards(transform.position,speed);
Debug.DrawLine(position,hitInfoR.point,Color.red);
}
else
{
Debug.DrawLine(position,position + right * 2,Color.green);
}
//left ray
if (hitInfoL.collider != null)
{
transform.position = Vector2.MoveTowards(position,position + left * 2,Color.green);
}
//up ray
if (hitInfoU.collider != null)
{
transform.position = Vector2.MoveTowards(position,position + up * 2,Color.green);
}
//down ray
if (hitInfoD.collider != null)
{
transform.position = Vector2.MoveTowards(position,position + down * 2,Color.green);
}
}
}
放在您的控制器中来关闭它,甚至可以在控制器级别或初始化程序中的应用级别对其进行自定义 wrap_parameters false
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。