관건: 중첩된 자원은 여전히 접근할 수 있습니다
묘사
은 CanCan wiki의 원래 지침을 따릅니다. - Nested Resources은 불필요한 행동을 초래할 수 있습니다.CanCan은
params[:project_id]
에서 제공된 항목에 대한 액세스 권한을 확인합니다.이것은 여전히 임무 검사를 우회할 가능성이 있다는 것을 의미한다.프로젝트 #5를 읽었다고 가정합니다.상위 항목에 관계없이 projects/5/tasks/47
으로 이동하면 작업 47이 표시됩니다.이 문제를 해결하려면 항상 before 필터에 다음 내용을 설정하십시오
@project = @task.project if @task
나는 위키 페이지를 업데이트했지만, 당신의 동의가 있어야만 대중에게 이런 건의를 제공할 수 있습니다.많은 사이트들이 이런 방식으로 공격을 받을 수도 있다.
토론 #1
wiki를 따라:through
옵션을 사용하여 load_and_authorize_resource
을 찾으면 @project.tasks.find(params[:id])
을 사용하여 작업을 찾을 수 없습니다.프로젝트에 속하지 않은 작업을 불러오려고 하면 ActiveRecord::RecordNotFound
을 받을 수 있습니다.토론 #2
네.load_and_authorize_resource through: :project
을 놓치지 않았지만 아래 코드가 CanCan 비헤이비어를 덮어썼습니다.문제는 다음과 같습니다.
# WRONG DEFAULT (generated by rails generate ...)
# Use callbacks to share common setup or constraints between actions.
def set_task
@task = Tasks.find(params[:id])
end
이것은'Rails 마법'의 한 개념이다.나는 이 점을 의식하지 못했다.몰라요.아마도 Controller Authorization Example - CanCan Wiki에서 이 문제를 언급하면 누군가를 도울 수 있을 것이다.당신은 어떻게 생각합니까?
토론 #셋
발전기가 지금 이렇게 하는 줄 몰랐어요.너는 당연히 제기할 수 있다위키에서.
2014년 8월 30일 토요일, 자이조[email protected]쓰기:
OK. I was not missing the load_and_authorize_resource through: :project, but the following code has overwritten the CanCan behaviour. The problem was, that I used this for loading:
잘못된 기본값 (rails 새 프로젝트에서 생성)
콜백을 사용하여 작업 간에 공통 설정 또는 구속을 공유합니다.
def set_task @task = Tasks.find(params[:id]) end
This is a consequnece of the 'Rails magic'. I didn't realize this.
I don't know. Maybe mentioning this problem in Controller Authorization Example - CanCan Wiki https://github.com/ryanb/cancan/wiki/Controller-Authorization-Example could help someone. What do you think?
— Reply to this email directly or view it on GitHub https://github.com/ryanb/cancan/issues/1014#issuecomment-53967224.
윌 그레
테네시주 내슈빌
토론 #4
비트 페이지 Controller Authorization Example은 이번 호와 관련하여 업데이트되었습니다.토론 #5
이 문제에 대한 해결 방안이 있습니까?내 프로그램에서 사용자는 다른 사용자의 항목 인덱스 페이지에 접근할 수 있습니다.(표시된 페이지가 예상대로 차단됨).예를 들어 사용자 2는 여전히
users/3/educations
으로 이동할 수 있습니다.내
EducationsController
은 다음과 같습니다. load_and_authorize_resource :user
load_and_authorize_resource :education, through: :user, only: [:index, :show, :new, :edit, :destroy]
before_action :set_education, only: [:show, :edit, :update, :destroy]
before_action :set_user
# Use callbacks to share common setup or constraints between actions.
def set_education
@education = Education.find(params[:id])
end
def set_user
@user = User.find(params[:user_id])
#@user = current_user
end
토론 #6
@dkonayuki 네,set_education
함수와 필터를 삭제합니다.Cancan은 @education
을 설정합니다.토론 #7
네, 했습니다.그것은 작용하지 않는다.마찬가지로 show 페이지에 접근할 수 없습니다.그러나 색인 페이지는 항상 표시됩니다.
이것은 능력의 관련 부분이다.rb:
블록에 정의된
can :manage, Education do |e| # only owner can manage his educations
e.user == user
end
토론 #8
기능은#accessible_by
과 호환되지 않습니다.이것들은 모두 위키에 묘사되어 있다.https://github.com/ryanb/cancan/wiki/Defining-Abilities-with-Blocks.조건 해시 (예: can :manage, Education, :user_id => user.id
) 를 사용하거나 SQL 세션을 제공해야 합니다.사용자가 교육 기록에 대한 읽기 권한을 가지고 있다면 색인 페이지에 접근할 수 있습니다.나는 네가 그곳의 기록을 필터하고 싶다고 가정한다.
토론 #9
답변 감사합니다.그러나 이런 것들은 모두 효과가 없다.(블록 및 조건 해시)
그나저나 저는 rails 4를 사용하기 때문에 # 속성에 접근할 수 있는 #이 없습니다.
그리고 교육도 사용자 전유에 속하기 때문에 다른 사용자가 다른 사용자의 교육에 접근할 수 있는 권한이 있어서는 안 된다.
토론 #10
나는 이 문제를 해결할 방법을 생각해냈다.인덱싱 작업에load_and_authorize_resource
이 아닌educations = @user.educations
authorize! :index, educations
Reference
이 문제에 관하여(관건: 중첩된 자원은 여전히 접근할 수 있습니다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://github.com/ryanb/cancan/issues/1014텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)