vue-router에서 1개 이외의 모든 루트를 잠글 수 있습니까?안전한가요?아니면 다른 방법을 써야 할까?
온라인 시험을 만들고 싶은데, 이 시험은 5페이지, 카운트다운 타이머(120초), 각 페이지에 4문항이 있습니다.120초 후에 사용자는 자동으로 다음 페이지로 이동하거나 그 전에 다음 버튼을 클릭할 수 있습니다.
Laravel 5.4 및 VueJs, 사용자가 답변하는 모든 질문에 대해 Ajax 요청이 있습니다.제가 원하는 것은 사용자가 다른 페이지를 볼 수 없도록 하는 것입니다.각 페이지는 최대 120초 동안 표시되어야 합니다.사용자는 뒤로 버튼을 클릭하여 이전 페이지를 볼 수 없습니다.이게 가능합니까?
이 앱을 만들고 싶다Vuejs
그리고.vue-router
어떻게 구현해야 할지 모르겠습니다.vue-router
조사를 좀 해봤지만 별로 성과가 없었어!
아니면 제가 이걸 쓰면 안 될 것 같아요.vue-router
다음과 같은 간단한 라우터를 사용합니다.
$("#page1").show();
$("#page2").hide();
$("#page3").hide();
.
.
// after 120 secs
$("#page1").hide();
$("#page2").show();
$("#page3").hide();
.
.
// i think this is not secure !
어떤 의견이라도 감사합니다.감사합니다.
업데이트: 이 테스트에서 사용자는 다음 목록을 볼 수 있습니다.English words
에서 무작위로 선택되다words
테이블 말고는 아무것도 없어!사용자는 자신이 의미를 안다고 생각하는 모든 단어를 클릭한다!그리고 클릭할 때마다 Ajax 요청으로 단어 ID를 저장합니다.results
테이블도 있고fake_words
50단어 랜덤 테이블이 선택됩니다.actual words
사용자가 가짜 단어를 3번 이상 클릭하면 테스트가 실패합니다.최종 결과는 사용자에게 그가 얼마나 많은 어휘력을 가지고 있는지 알려줄 것입니다.
업데이트 2: 이 작업을 수행하려고 했습니다.vue-router
하지만 코드화를 시작하기 전에, 저는 이 코드가 다음과 같이 구현되어서는 안 된다고 생각했습니다.vue-router
모든 질문이 DB에서 무작위로 하나의 쿼리로 수신되고, 시험이 시작되기 전에 모든 질문이 브라우저로 전송(ajax)됩니다. 이제 어떻게 해야 합니까?그것들을 다른 배열로 분할하여 각 배열의 질문을 내 페이지 중 하나에 전송하시겠습니까?꼭 그래야 하나요? 하나만 쓰면 안 되나요?v-for
그들을 위해?만약 내가 질문의 수를 바꾸기로 결정한다면?그러면 매번 코드를 터치해서 새로운 페이지를 만들어야 할 것 같아요.vue-router
또는 페이지 중 하나를 제거합니다.
이것이 시험과 같은 위험성이 높은 코드라면, 「클라이언트를 신뢰하지 않는다」라고 하는 접근방식을 재검토할 필요가 있습니다.당신의 문제를 해결하기 위해 백엔드에 코드를 쓸 것을 제안합니다.
1) 다음과 같은 미들웨어로 엔드포인트를 보호합니다.
2) 페이지 방문 시 타임스탬프 작성
3) 120초 후 사용자로부터의 새로운 투고(답변)를 받지 않는다.
주의: 온라인에서도 답변해 주셨으면 합니다.그 외 보안은 확보되지 않습니다.브라우저 창에 질문을 넣으면 최상의 코드를 사용하여도 항상 이 질문을 캐싱할 수 있습니다.
편집: 페이지 번호부여를 사용하여 시간제한을 두고 질문을 하나씩 보냅니다.
edit 2:devtools가 열리면 서버에도 알림을 보냅니다.https://github.com/sindresorhus/devtools-detect 에 접속할 수 있습니다.
이 토막이 도움이 될 수 있습니다.
const app = new Vue({
el: '#app',
data: {
stepOne: 1,
}
});
<step v-if="step==1"></step>
timeInterval = setInterval(function() {
goToNextStep(2);
this.$parent.stepOne = 0;
}.bind(this), 12000);
보안에 관한 한 JS 프레임워크의 선택은 거의 영향을 미치지 않습니다.Vue.js는 훌륭한 선택입니다.다음은 시작하는 데 도움이 되는 샘플 코드입니다.
<template>
<div>
<div id="question" v-if="question">
{{question}}
<button @click="nextQuestion();" v-if="hasNextQuestion()"></button>
</div>
</div>
</template>
<script>
export default {
data() {
return {
curQuestionNo: 0,
maxQuestions: 4
question: null,
timer: null
}
},
methods: {
fetchQuestion () {
// return one question at a time from the server. Storing all questions on the client is not recommended.
var url = 'https://myapi.com/question?curQuestionNo=' + this.curQuestionNo;
axios.get(url) // or however you prefer to make ajax calls
.then(res => {
this.question = res.question;
this.curQuestionNo++;
this.stopTimer();
if(this.hasNextQuestion()) {
this.startTimer();
}
})
.catch(() => {
// do some error handling
});
},
startTimer () {
this.timer = setTimeout(() => {
this.nextQuestion();
}, 120 * 1000);
},
stopTimer () {
clearTimeout(this.timer);
},
nextQuestion () {
if(this.curQuestionNo > 0) {
this.markAnswered(function() {
this.fetchQuestion();
})
} else {
this.fetchQuestion();
}
},
markAnswered (cb) {
// record the answered question on server
// server should only send the next question after this
var url = 'https://myapi.com/mark-complete?curQuestionNo=' + this.curQuestionNo;
axios.post(url)
.then(res => {
this.fetchQuestion();
})
.catch(() => {
// do some error handling
});
},
hasNextQuestion () {
return this.maxQuestions - (this.curQuestionNo + 1) > 0;
}
},
created () {
this.nextQuestion();
}
}
</script>
서버 측에서는 다음과 같은 방법을 권장합니다.
- 클라이언트에 요청당 질문 1개 전송
- API가 다음 질문을 클라이언트에 반환하기 전에 사용자가 이전 질문에 답변했는지 또는 질문에 답변할 수 있는 기간이 만료되었는지 확인하십시오.이것은 매우 간단하게 실시할 수 있습니다.데이터스토어에 카운터를 보관하고, 유저 마다 마지막에 회답한(또는 기한이 만료된) 질문 번호를 기록합니다.사용자는 레코드에 기재된 번호 이하의 질문 번호에 대답할 수 없습니다.서버는, 레코드내의 번호보다 1 큰 질문 번호만을 송신할 필요가 있습니다.
샘플 코드(Larabel 5 구문은 확실하지 않지만 아이디어를 얻어야 합니다):
Route::get('question', function(){
$curQuestionNo = intVal(Input::get('curQuestionNo'));
$user = User::find($userId); // get the logged in user, for example
if($user->current_question_number === $curQuestionNo) {
$question = Question::where('question_no', $curQuestionNo + 1);
$question->sent_at = time(); // store the time when the question was sent
return $question
} else {
// deny access
}
});
Route::post('mark-complete', function(){
$curQuestionNo = intVal(Input::get('curQuestionNo'));
$user = User::find($userId); // get the logged in user, for example
$question = Question::find($curQuestionNo);
if($question->sent_at > 120 seconds) {
// do not record answers
} else {
// record answers
}
$user->current_question_number = $curQuestionNo;
$user->save();
});
언급URL : https://stackoverflow.com/questions/45244566/is-it-possible-to-lock-all-routes-except-one-in-vue-router-is-it-secure-or-m
'programing' 카테고리의 다른 글
Vue.js에서 이러한 종속성을 찾을 수 없습니다. (0) | 2022.08.07 |
---|---|
Maven에서는 간단한 Java 10 / Java 11 프로젝트를 컴파일할 수 없습니다. (0) | 2022.08.07 |
vue 컴포넌트를 새로고침하려면 어떻게 해야 합니까? (0) | 2022.08.07 |
동일한 폴더에 여러 vue 앱을 생성하는 방법 (0) | 2022.08.07 |
GCC를 사용하여 C에 긴 int를 인쇄하시겠습니까? (0) | 2022.08.07 |