ク○スファイアというオンラインゲームのウェブページではJavaScriptで特殊文字を禁止したり、入力文字数を制限している。
しかし最近のブラウザではURLバーからJavaScriptを実行できるため行動を制限しても簡単に回避できるようになっている。
上記の問題をソースコードを例に紹介してみる。
<script><!–
function sendForm(){
if(document.testForm.msg.value<=10){
document.testForm.submit();
}else{alert(“10文字以下で入力してください。”);}
}
//–></script><form name=”testForm” action=”送信先URL”>
<input type=”text” name=”msg”/>
<input type=”submit” value=”送信” onClick=”sendForm()”/>
</form>
上記のようなソースコードの場合、判定を迂回したかったらURLバーに
javascript:document.testForm.submit();
と一行入力するだけで判定を迂回できる。
ではどのようにして迂回させないようにするか。
これもまた簡単だ。しかしJavaScriptだけでは解決できない。
流れはこんな感じ。
一度データを送信してしまい、サーバーサイドでデータを破棄するかどうかの判定を行いレスポンスを返す。
これもソースコードにして紹介。
送信側のファイルの内容
<script><!–
function sendForm(){
jQuery.get(
”./target.php?msg=”+document.testForm.msg.value,
null,
function(data){
alert(data.responseText);
}
);
}
//–></script><form name=”testForm” action=”javascript:sendForm()”>
<input type=”text” name=”msg”/>
<input type=”submit” value=”送信”/>
</form>
受信側のファイルの内容(target.php)
<?php
$data=$_REQUSET[“msg”];
if($dataに対する条件をいろいろとここに書く){
//条件を満たしたときの動作
echo “送信に成功しました。”;
}else{
echo “送信されたデータが条件を満たしていません。”;
}
?>
こうしておけばクライアントサイドからではデータの送信しかできず、判定はサーバーサイドで行われる。
ふと思い浮かんだものをメモ的に書いたものなので動作検証はしていません。
結論:クライアントサイドでの制限は飾りにしかならない。
いや、そもそもURLバーからJavaScriptを実行できるのはいいのだろうか。便利だけどさ。