質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.21%

「セキュリティーゲーム作成。クリアしたら~の部分をどうしたらよいか悩んでいる」

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 619

kazoogon

score 274

ただ今簡単なセキュリティーゲームのようなアプリを作っています。
現段階では脆弱性のあるコードでusernameとpaswwordを入力してもらう欄を作り、ゲームする人にはusernameは教えた状態でパスワードをどうにか入力してその人の情報を取って来れたら次のステージに行ける(「クリアおめでとう!次のステージへ」というボタンが出てくる)というようにしようと思っています。
分かる人にはすぐわかると思いますが、これはSQLインジェクションで

hoge' or 'A'='A 


などと入力すると情報が取ってこれます。

ここで質問ですが、この場合の「もしクリアできたら(=もし情報を取ってこれたら)、ボタンが出現するのコードをどうすればよいか迷っています。
詳細は↓のコードの中に書きました、よろしくお願いします。
cont.php

<?php
//sql injection
require_once '../security_model.php';

$link= db_connect();

$username = "";
$password = "";

if($hide === "login"){
    $username = get_post('username');
    $password = get_post('password');

    if((login($link,$username,$password)) === FALSE){
        $error_for_me[]="login SELECT失敗";
    }
}

include_once 'view.php';


view.php(パスワードは入力する人がわかるようあえてtextタイプ)

<!DOCTYPE html>
<html>
    <meta charset="utf-8">
    <head>
        <title>SQL injection</title>
    </head>
<body>
<h1>SQLインジェクション</h1>
    <form action="cont.php" method="POST">
        <input type="text" value="" name="username" placeholder="username">
        <input type="text" value="" name="password" placeholder="password">
        <input type="submit" name="login" value="show data!">
    </form>

    <table border="1">    
        <tr>
            <th>名前</th>
            <th></th>
            <th>特徴</th>
        </tr>
        <tr>
            <td><?php echo $login['username'] ?></td>
            <td><?php echo $login['age'] ?></td>
            <td><?php echo $login['feature']; ?></td>
        </tr>
    </table>
</body> 


security_model.php(DB部分の関数は省略)

function get_post($name){
    if(isset($_POST[$name])===TRUE){
        return $_POST[$name];
    }else{
        return FALSE;
    }
}
function login($link,$username,$password){
    if($username===""){
        $error[]="please fill in username";
    }else if($password === ""){
        $error[]="please fill in password";
    }
    if(count($error === 0)){
        $query='SELECT * 
                FROM user 
                WHERE password = \''.$password.'\' AND username = \''.$username.'\'';
        return  select($link,$query);
    }else{
        $error[]="*failed login".$query;
        return FALSE;
    }
}
function select($link,$query){
    global $error_for_me;
    if($login_button = mysqli_query($link,$query)){ 
        if(($login_gift = mysqli_fetch_assoc($login_button))!==FALSE){
            return $login_gift;
            //**たぶんここになんらかの処理を書くと思うのですが
      //**例えばjqueryなどでdisplay:none;に設定したボタンを見えるようにすることは可能なのか? またこれとは全く違う発想が何かあるのか??
        }else{
            return FALSE;
        }
    }else{
        return FALSE;
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

それ以前に、こういったアプリでは、想定した内容以外の箇所に脆弱性があってはいけないので、徹底的に潰しておかないとダメでは?
ざっと見たところだけでも、
・username もダメでしょ
・csrf 対策も無い
とあるので、ユーザが想定外の行動を取ると思います。

サーバ側も連続アクセスの制限とかしておかないと、辞書攻撃で落ちるとかありそうです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

侵入試行体験アプリならば一般的な会員制サイトを模して、ログイン後のページに次のステージへのリンクなりボタンを置くのがよいと思います。

cont.php でログイン処理(username, password照合)と、ログインページの描写(view.php呼び出し)を行っていますが、ここにログイン成功時に成功ページの view を表示する条件分けを入れるのがベターだと思います。

それとも "次のステージへ" のリンクを非表示にして(でもソースでは丸見え)、それも脆弱性の教材としたいという話でしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/17 15:31

    回答ありがとうございます。 提案していただいた、成功時に成功ページのviewを表示させる方法でいこうと思います。たすかりました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • トップ
  • PHPに関する質問
  • 「セキュリティーゲーム作成。クリアしたら~の部分をどうしたらよいか悩んでいる」