記事の作成日 : 2020/03/01
Youtubeには他のサイトでYoutubeの動画を再生できるようなサービスがあります。
<iframe src='https://www.youtube.com/embed/ ここに動画ID '></iframe>
innerHTMLを使って<iframe>自体を書き込むのですが、ちょっと問題があります。 問題というのはセキュリティーに関するもので、
<script>
// 更新ボタンが押されたら実行されるよ
function update() {
// テキストボックスから 動画のIDであろう文字列 を取得する。
var vid = document.getElementById("video_id").value;
// 下のinnerHTML で使う
var video = document.getElementById("video");
// 書き込む
video.innerHTML = "<iframe frameborder='0' width='100%' height='360px' src='https://www.youtube.com/embed/" + vid + "'></iframe>";
}
</script>
<!-- テキストボックス -->
動画ID(v = ??):<input id="video_id" type="url">
<!-- 更新ボタン -->
<input onclick="update()" type="button" value="更新する">
<!-- innerHTMLで書き出される場所 -->
<div id="video"></div>
上記の場合、テキストボックスに
return " <a href=' "+ link +" '>リンク</a> "
linkに '></a> @ <a href='を代入することによって最終的には、
<a href=' '></a> @ <a href=' '>リンク</a>
となり、@ が表示されます。
処理前 | 処理後 |
---|---|
< | &lt; |
> | &gt; |
" | &quot; |
' | &#39; |
<script>
function secureCheck(req) { // 指定された文字列に悪意のあるコード実行させないための処理だよ
var allow = "[a-z,A-Z,0-9,_,-]"; // 許可される文字(正規表現を使ってる)
var len = req.length - 1;
var typedtc = "", // あなたは文字列だっ(これをしておかないと undefined が入っちゃう)
safe = "",
i = 0;
for (i = 0; i <= len; i++) {
typedtc = req[i].match(allow); // match は合っているならば そのまま返ってくる。 不一致ならば null が返ってくる。
if (typedtc != null) {
safe += typedtc; // null じゃなかったら増やしていく
}
}
return safe; // 出力する
}
function update() {
var output;
var elem = document.getElementById("video_id");
var video = document.getElementById("video");
output = secureCheck(elem.value);
if (output == "") {
return
} // 空白だったらキャンセル
video.innerHTML = "<iframe frameborder='0' width='100%' height='360px' src='https://www.youtube.com/embed/" + output + "'></iframe>";
}
</script>
<!-- テキストボックス -->
動画ID(v = ??):<input id="video_id" type="url">
<!-- 更新ボタン -->
<input onclick="update()" type="button" value="更新する">
<!-- innerHTMLで書き出される場所 -->
<div id="video"></div>