【의견 모집】신발상? 양식 보안 정보

Twitter의 팔로워 씨와 이야기하고 있어, 이미 있을 것 같지만, 어쩌면 사용할 수 있을지도 모르는 폼의 시큐리티를 발견했으므로 써 둡니다.

예를 들어 일반적인 로그인 양식은 이런 느낌이죠?

index.php
<?php
    mb_internal_encoding("utf-8");

    @session_start();

    if (isset($_SESSION['login'])&&$_SESSION['login']=="login") {
echo <<< EOM
ログイン
<form action="./logout.php" method="post">
    <input type="submit" value="ログアウト"></input>
</form>
EOM;
    }else{
echo <<< EOM
<form action="./login.php" method="post">
    <label>ID</label>
    <input name="username"></input>
    <label>PW</label>
    <input name="userid"></input>
    <input type="submit" value="ログイン"></input>
</form>
EOM;
    }
?>

login.php
<?php
    mb_internal_encoding("utf-8");

    @session_start();

    if(isset($_POST['username'])&&
    isset($_POST['userid'])&&
    $_POST['username']==="admin"&&
    $_POST['userid']==="root"){
        $_SESSION['login'] = "login";
    }
    header('location:./');
?>

표시하면 이런 느낌


이것은 ID(username)에 admin, PW(userid)에 root라고 넣으면 로그인할 수 있습니다.
그러나 이것이라면 사전 공격 등으로 쉽게 돌파 할 수 있습니다.

그래서 login.php를 이렇게 바꿉니다.

login.php
<?php
    mb_internal_encoding("utf-8");

    @session_start();

    if(isset($_POST['username'])&&
    isset($_POST['userid'])&&
    $_POST['username']==="admin"&&
    $_POST['userid']==="root"&&
    $_POST['pass']==="pass"){
        $_SESSION['login'] = "login";
    }
    header('location:./');
?>

한 줄 추가했지만 테이블의 양식에 나타나지 않는 값 pass를 검사하고 있습니다. 이것에 들어가기 위해서는 index.php를 브라우저를 표시한 후, 검증 툴등으로 pass 입력용의 input를 추가해 줄 필요가 있습니다.

간단합니다만, 원래 그 추가하는 룰을 모르지 않으면 안되는 일과 name와 값을 모르면 사전 공격으로 돌파되지 않는 폼이 생겼다고 생각합니다. 예를 들어 추가하는 input의 수를 늘리거나, type="hidden"로 외형을 위장하면 더욱 견고해져 가는 것이 아닐까요.

자신의 지식이라면 이 방법은 들은 적이 없습니다만, 이미 이름이 붙어 있거나 약점이 있거나 하는 것입니까··.
가짜 로그인 사이트가 만들어지면 안됩니다.

좋은 웹페이지 즐겨찾기