Skip to content

Commit 9ea63e7

Browse files
committed
Add Japanese translation for labs/ja_deserialization
This patch adds Japanese translation for labs/deserialization. Signed-off-by: Taku SHIMOSAWA <[email protected]>
1 parent 5e33c0f commit 9ea63e7

File tree

2 files changed

+126
-0
lines changed

2 files changed

+126
-0
lines changed

docs/labs/deserialization.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,29 +37,35 @@ info =
3737
{
3838
absent: "^ const data =\n",
3939
text: "The first section should begin with `const data =`",
40+
text_ja: "最初のセクションは、`const data =`で始めなければなりません。",
4041
},
4142
{
4243
present: "json",
4344
text: "the JSON built-in global object is witten in uppercase.",
45+
text_ja: "JSONというビルトインのグローバルオブジェクトは全て大文字で書かれます",
4446
},
4547
{
4648
absent: String.raw`JSON \. parse
4749
`,
4850
text: "Make a call to `JSON.parse` with the data retrieved, e.g., `JSON.parse(base64Decoded)` should be stored in `data`.",
51+
text_ja: "取得したデータに対して`JSON.parse`を呼んでください。例: `JSON.parse(base64Decoded)`は`data`に格納されなければなりません",
4952
},
5053
{
5154
present: String.raw`\+
5255
`,
5356
text: "You should not have any concatenation (`+`) in the first section.",
57+
text_ja: "最初のセクションでは、文字列連結(`+`)を用いるべきではありません。",
5458
},
5559
{
5660
absent: "; $\n",
5761
text: "JavaScript does not require semicolons at the end of a statement, but since the other statements terminate with semicolons, you should also terminate your statement with a semicolon to be consistent.",
62+
text_ja: "JavaScriptではステートメントの最後にセミコロンは必須ではありませんが、他のステートメントはセミコロンで終わっているため、一貫性を保つためにセミコロンでステートメントを終わらせなければなりません。",
5863
},
5964
{
6065
absent: String.raw`^ if \(`,
6166
index: 1,
6267
text: "The second section should start with `if (` followed by a condition.",
68+
text_ja: "二番目のセクションは、`if (`で始めてその次に条件を書かなくてはなりません。",
6369
examples: [
6470
[
6571
"const data = JSON.parse(base64Decoded);",
@@ -72,33 +78,39 @@ info =
7278
`,
7379
index: 1,
7480
text: "Check if the data object has a property called username. You can do this by referencing data.username.",
81+
text_ja: "データオブジェクトがusernameというプロパティを持っているかをチェックしてください。これは、data.usernameを参照することによって行うことができます。",
7582
},
7683
{
7784
absent: String.raw`\&\&`,
7885
index: 1,
7986
text: "To combine multiple conditions in JavaScript use &&. This operator means 'and', so both conditions must be true for the entire statement to pass.",
87+
text_ja: "JavaScriptで複数の条件を結合するには&&を用います。この演算子は「かつ」(AND)を意味し、ステートメント全体をパスするためには両方の条件が真でなければなりません。",
8088
},
8189
{
8290
absent: "typeof",
8391
index: 1,
8492
text: "Use typeof to check the type of the operand's value. You should have `typeof data.username == 'string'` or similar.",
93+
text_ja: "typeofを用いてオペランドの値の型をチェックしてください。`typeof data.username == 'string'`のようになるはずです。",
8594
},
8695
{
8796
present: String.raw`typeof data \. username == 'String'
8897
`,
8998
index: 1,
9099
text: "When using typeof, JavaScript expects \"string\" all lowercase.",
100+
text_ja: "JavaScriptでtypeofを使う際には、\"string\"を全て小文字で表記します。",
91101
},
92102
{
93103
absent: "length",
94104
index: 1,
95105
text: "check if the length of the string is smaller than 20 characters. Use the expression `data.username.length &lt; 20` to determine this.",
106+
text_ja: "文字列の長さが20文字より小さいことをチェックしてください。`data.username.length &lt; 20`というエクスプレッションを使って判断してください。",
96107
},
97108
{
98109
present: String.raw`^ if \(`,
99110
absent: String.raw`^ if \( data \. username &&`,
100111
index: 1,
101112
text: "Begin the second section with `if ( data.username && ... ` because you must check if data is even present before you can check various attributes of that data.",
113+
text_ja: "二番目のセクションを`if ( data.username && ... `で始めてください。これは、データのいろいろなアトリビュートをチェックする前に、それがそもそも存在するかをチェックしなければならないからです。",
102114
examples: [
103115
[
104116
"const data = JSON.parse(base64Decoded);",

docs/labs/ja_deserialization.html

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
<!DOCTYPE html>
2+
<html lang="ja">
3+
<head>
4+
<meta charset="utf-8">
5+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
6+
<meta name="viewport" content="width=device-width, initial-scale=1">
7+
<link rel="stylesheet" href="https://best.openssf.org/assets/css/style.css">
8+
<link rel="stylesheet" href="checker.css">
9+
<script src="checker.js"></script>
10+
<script src="deserialization.js"></script>
11+
<link rel="license" href="https://creativecommons.org/licenses/by/4.0/">
12+
13+
<!-- See create_labs.md for how to create your own lab! -->
14+
15+
</head>
16+
<body>
17+
<!-- For GitHub Pages formatting: -->
18+
<div class="container-lg px-3 my-5 markdown-body">
19+
<h1>ラボ演習 deserialization</h1>
20+
<p>
21+
これはセキュアなソフトウェア開発に関するラボ演習です。
22+
ラボの詳細については、<a href="ja_introduction.html" target="_blank">概要</a>をご覧ください。
23+
24+
<p>
25+
<h2>タスク</h2>
26+
<p>
27+
<b>下記のコードを変更して、安全でないデシリアライゼーション(Insecure Deserialization)の脆弱性を防止するようにしてください。</b>
28+
29+
<p>
30+
<h2>背景</h2>
31+
<p>
32+
安全でないデシリアライゼーションは、アプリケーションのデシリアライゼーションのプロセスが悪用されて起こり、攻撃者がシリアライズされたデータを改変してアプリケーションコードに悪影響を及ぶデータを渡すことができてしまうものです。
33+
<p>
34+
この脆弱性を防ぐ最も安全な方法は、信頼できないソース(ユーザーがコントロールできるデータ)からシリアライズされたオブジェクトを受け入れないようにすることです。しかし、もし受け入れる必要があるときには、実装することのできる緩和策がいくつかあります。このラボでは、そのような緩和策をいくつか適用します。
35+
36+
<p>
37+
<h2>タスクの詳細</h2>
38+
<p>
39+
40+
<p>
41+
下記のコードは、アプリケーションのログインページの後に呼ばれます。ログイン後、ユーザーのプロファイルを含むクッキーが作られ、ホームページでクッキーはデシリアライズされ、その中のユーザー名(username)を挨拶のメッセージで使います。
42+
<p>
43+
このコードをよりよく見ると、クッキーからデータをデシリアライズする際に<tt>eval()</tt>を用いていることがわかります。これは非常に危険となりうるもので、<tt>eval()</tt>は文字列をJavaScriptのコードとして評価するために、文字列に含まれる任意のコードが実行されることとなり、リモートコード攻撃(RCE)やコードインジェクション攻撃の可能性を開くものです。
44+
<p>
45+
このラボでは、攻撃者がコードを実行することを防ぐアプローチを用いてこれを修正します。また、簡単な入力のバリデーションを行うことで、JSONデータから得られるものが期待通りものであることを確認します。
46+
<ol>
47+
<li>
48+
<tt>eval()</tt><tt>JSON.parse()</tt>で置き換えてください。JSON.parse( )は関数やメソッドといったJavaScriptのコードを実行することはないため、デシリアライゼーションへのはるかに安全なアプローチです。
49+
</li>
50+
<li><tt>data.username</tt>が存在するかどうかのチェックに加えて、その値に対して簡単なバリデーションを行ってください。値が文字列であり(<tt>typeof data.username == 'string'</tt>)、それが20文字未満である(<tt>data.username.length &lt; 20</tt>)ことを確認してください</li>
51+
</ol>
52+
53+
<p>
54+
必要に応じて、「ヒント」ボタンと「諦める」ボタンを使用してください。
55+
56+
<p>
57+
<h2>演習 (<span id="grade"></span>)</h2>
58+
<p>
59+
<p>
60+
61+
下記のコードを変更して、安全でないデシリアライゼーションを防ぐ緩和策を追加してください。
62+
<ol>
63+
<li>信頼できないコードの実行を防ぐデシリアライゼーションのアプローチを用いてください。</li>
64+
<li>ユーザー名(username)をバリデートし、それが<b>文字列であり</b><b>20文字</b>未満である場合にのみ応答するようにしてください。</li>
65+
</ol>
66+
<form id="lab">
67+
68+
<pre><code
69+
>const express = require('express');
70+
const cookieParser = require('cookie-parser');
71+
72+
const app = express();
73+
74+
app.use(express.json());
75+
app.use(cookieParser());
76+
77+
app.get('/', (req, res) => {
78+
if (req.cookies.profile) {
79+
try {
80+
const base64Decoded = Buffer.from(
81+
req.cookies.profile, 'base64').toString('utf8');
82+
<input id="attempt0" type="text" size="60" spellcheck="false"
83+
value="const data = eval('(' + base64Decoded + ')');">
84+
85+
<textarea id="attempt1" rows="3" cols="60" spellcheck="false"
86+
>if (data.username) {</textarea>
87+
// XSSを防ぐために、信頼できないデータでres.sendを用いることは避けてください。
88+
res.render('index', {username: data.username});
89+
}
90+
91+
} catch (err) {
92+
res.send('An error occurred.');
93+
}
94+
} else {
95+
res.send("Please Login");
96+
}
97+
});
98+
</code></pre>
99+
100+
101+
<button type="button" class="hintButton">ヒント</button>
102+
<button type="button" class="resetButton">リセット</button>
103+
<button type="button" class="giveUpButton">諦める</button>
104+
<br><br>
105+
<p>
106+
<i>このラボは、Camila Vilarinhoによって開発されました。</i>
107+
<br><br>
108+
<p id="correctStamp" class="small">
109+
<textarea id="debugData" class="displayNone" rows="20" cols="65" readonly>
110+
</textarea>
111+
</form>
112+
</div><!-- End GitHub pages formatting -->
113+
</body>
114+
</html>

0 commit comments

Comments
 (0)