最後來介紹最簡單的加減乘除吧。 範例: var j=8; var k=0; for (var i = 0; i < 10; i++ , j += 4) { k+=j/2+j; } 會輸出28 題目: 圓周率近似值約等於3.14159265359 這個題目要產生一個函數,回傳自己計算出來的圓周率。 公式為:π/4≈1-1/3+1/5-1/7+1/9-1/11... 我們從一開始計算,減掉三分之一、加上五分之一、減掉七分一...算完之後乘以四。 此程式將使用迴圈跑五百萬次,讓它計算的更為精確。 請在文字框中輸入程式碼,讓函數回傳圓周率。 驗證標準:a > 3.141591 && a < 3.141593 限制:不能直接指派常數或是使用跟題目規定無關的方法 function New() { var a = 1; var j = 3.0; for (var i = 0; i < 5000000; i++ , j += 4.0) { } a*=4; return a; }
解答 (鑽漏洞方法): "if(a=Math.PI/4,!i)break;"
回覆刪除好難得,自這個題庫在2019/8/1建立以來,竟然有人來這個頁面留言(說不定是認識的人)。
刪除在此感謝您的回饋,漏洞我就不修正了,當作紀念。
哈囉~我回來了! 時隔一年突然又回到這裡。😂
刪除你應該不認識我啦(畢竟我今年才大一)。
在此提供另一個鑽漏洞方法:
a=!i||Math.PI/4;
經過檢查你的原始碼,我發現你只檢查第一次迴圈的值,所以利用短路求值檢查是否為第一次迴圈就可以繞過了。
此題正解:
a-=1/j-1/(j+2);
如果你要修正漏洞的話:
刪除var workerCode = `self.onmessage = function(e) {
var error = "";
var result = -1;
try {
const userAnswerCode = e.data.userCode;
var a = 1;
var oa = a;
var j = 3.0;
if (userAnswerCode.includes("random")) throw new Error("偵測到違規動作或作弊行為");
if (userAnswerCode.includes("return")) throw new Error("偵測到違規動作或作弊行為");
if (userAnswerCode.split(";").length-1>=2) throw new Error("語法出錯");
const userLogic = new Function('a', 'j', 'i', userAnswerCode + ";\\nreturn a;");
for (var i = 0; i < 5000000; i++, j += 4.0) {
try {
a = userLogic(a, j, i);
} catch (e) {
throw new Error("語法出錯: " + e.message);
}
if (a > 3.141591/4 && a < 3.141593/4 && a === oa) {
throw new Error("偵測到違規動作或作弊行為");
}
oa = a;
}
result = a*4;
} catch (e) { error = e.message };
self.postMessage({ result, error });
}`;
function enter() {
try {
var answer = 1;
var userCode = document.getElementById('test1').value;
const blob = new Blob([workerCode], { type: 'application/javascript' });
const workerUrl = URL.createObjectURL(blob);
const worker = new Worker(workerUrl);
worker.onmessage = function(e) {
if (e.data.error) return alert(e.data.error);
answer = e.data.result;
if (answer > 3.141591 && answer < 3.141593) {
alert("值為:" + answer + "\n恭喜您,此測驗全數通關了");
document.location.href="https://corettainformation.blogspot.com/p/javascript_14.html";
}
else if (answer==-1) alert("錯誤");
else { alert("值為:" + answer + "\n錯誤"); }
//想看解答嗎,哈哈,你還太淺了。
};
worker.postMessage({ userCode });
}
catch {
alert("錯誤");
}
}
我已經盡可能把漏洞補起來了,但是仍然很可能還是有漏洞。
好難得,自這個題庫在2019/8/1建立以來,竟然有人來這個頁面留言(說不定是認識的人)。
回覆刪除在此感謝您的回饋,漏洞我就不修正了,當作紀念。
您好,想請問範例的 28 是怎麼來的?
回覆刪除我的計算是:j=44, k=390