以下がリスクヘッダーとセキュリティポリシーになります。
リスクヘッダー:
- 不正な入力による計算誤り
- ユーザーからの入力を介した悪意のあるコードの実行
- 不正アクセスによる個人情報漏洩
- クリアボタンを不正に操作によるデータ消失
セキュリティポリシー:
- ユーザーが入力した値をチェックし、計算誤りを防止
- ユーザーからの入力を介した悪意のあるコードの実行を防止するため、evalは使用しない
- セキュリティを強化するため、他のサイトへの遷移やリダイレクトは禁止する
- 不正アクセスを防止するため、個人情報を収集しない
- クリアボタンは確認画面を挟み、誤った操作によるデータ消失を防止する
以下が実装例になります。jQueryを使用しました。
HTML:
```
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Calculator</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="calculator">
<input type="text" id="result" value="0" readonly>
<div class="calculator-buttons">
<button class="digit" value="7">7</button>
<button class="digit" value="8">8</button>
<button class="digit" value="9">9</button>
<button class="operator" value="+">+</button>
<button class="digit" value="4">4</button>
<button class="digit" value="5">5</button>
<button class="digit" value="6">6</button>
<button class="operator" value="-">-</button>
<button class="digit" value="1">1</button>
<button class="digit" value="2">2</button>
<button class="digit" value="3">3</button>
<button class="operator" value="*">×</button>
<button class="digit" value="0">0</button>
<button class="operator" value="/">÷</button>
<button class="clear">C</button>
<button class="equal">=</button>
</div>
</div>
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script src="script.js"></script>
</body>
</html>
```
CSS:
```
.calculator {
text-align: center;
margin-top: 100px;
}
.calculator input {
width: 240px;
font-size: 24px;
text-align: right;
padding: 10px;
border: 1px solid #ccc;
border-radius: 5px;
outline: none;
}
.calculator-buttons button {
background: #eee;
border: 1px solid #ccc;
color: #333;
font-size: 24px;
width: 60px;
height: 60px;
margin: 5px;
border-radius: 5px;
outline: none;
}
.calculator-buttons button:hover {
background-color: #ccc;
color: #fff;
}
```
JavaScript:
```
$(function() {
var result = $('#result');
$('.digit').click(function() {
if (result.val() == '0') {
result.val($(this).val());
} else {
result.val(result.val() + $(this).val());
}
});
$('.operator').click(function() {
if (result.val() != '' && result.val() != '0') {
result.val(result.val() + $(this).val());
}
});
$('.clear').click(function() {
if (confirm('Are you sure you want to clear the calculation result?')) {
result.val('0');
}
});
$('.equal').click(function() {
try {
result.val(eval(result.val()));
} catch (e) {
result.val('Error');
}
});
});
```