トップ «前の日(03-03) 最新 次の日(03-05)»

PC関係のメモ


単発のバイト / Subversion 1.0.0 on Debian / htpasswd.php (2) / ProFTPDの設定 / htpasswd.php (3)

単発のバイト

Photoshopでお絵かき。前の人が作ったファイルを眺めながら、シェイプを多用して書いてみた。Illustrator使ったほうが楽のような・・・

環境が結構カスタマイズしてある。Photoshopの設定はもちろん、日本語入力がIMEじゃなくてAtokなのが一番戸惑う。

htpasswd.php (2)

  • パスワードを変更ができる
  • ユーザを追加できる
  • ユーザの削除は未対応

まだろくに検証して無いのでバグがあったらツッコミで教えてください。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>htpasswd</title>
</head>
<body>
<form method="post" action="htpasswd.php">
User:<br>
<input type="text" name="user" value=""><br>
Password:<br>
<input type="text" name="password"><br>
<input type="submit" name="submit">
</form>
<?php
$filename = 'secret/.htpasswd';

$user = $_POST['user'];
$password = $_POST['password'];
if (isset($_POST['password'])) {
    $change = false;
    $salt = substr($password, 0, 2);
    $file = file($filename);
    $fp = fopen($filename, 'w');
    flock($fp, LOCK_EX);
    foreach($file as $line) {
        list($u, $p) = explode(':', rtrim($line), 2);
        if($u == $user) {
            $p = crypt($password, $salt);
            $change = true;
        }
        fwrite($fp, "{$u}:{$p}\n");
    }
    if(!$change) {
        fwrite($fp, "{$user}:" .  crypt($password, $salt) . "\n");
        echo htmlspecialchars($user) . "が追加されました";
    } else {
        echo htmlspecialchars($user) . "のパスワードを更新しました";
    }
    flock($fp, LOCK_UN);
    fclose($fp);
}
?>
</body>
</html>

ProFTPDの設定

今はこれ

ServerName			"debian"
ServerType			inetd
DefaultServer			on
Port				21
Umask				022
MaxInstances			30

User				nobody
Group				nobody

TimesGMT			off
ListOptions			"-a"
UseReverseDNS			off
IdentLookups			off

AuthPAMAuthoritative		on
AuthPAMConfig			ftp

DefaultRoot			~

<Directory />
	AllowOverwrite		on
</Directory>

htpasswd.php (3)

なかみつさんのツッコミより

$saltはランダムな2文字にしたほうがよろしいかと.

確かに。パスワードの最初の2文字では心配だったんですが、単にcryptの第二引数を省略すればランダムで作ってくれるとのこと。

以下の関数をGAIJIN.atで見つけていたんですが、PHPにランダムで生成してもらうほうが簡単。

function genSalt(){
  // *** zwei zufallige Zeichen generieren ***
  srand((double)microtime()*1000000);
  $random=rand();
  $rand64="./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  $salt=substr($rand64,$random%64,1).substr($rand64,($random/64)%64,1);
  $salt=substr($salt,0,2);
  return($salt);
}

あと、MD5とかSHA1でハッシュ化するとより安全かも。ラジオボタンでDES,MD5,SHA1を選択したりして。

追記:

cryptの第二引数を省略したらMD5 saltが生成された。crypt関数のマニュアルを読んでみたら

saltが指定されない場合、システ ムのデフォルトの暗号化手法がMD5でない限りPHPはデフォルトで標準の2 文字DES saltを自動的に生成します。暗号化手法がMD5の場合、MD5互換 のsaltが生成されます。

少なくとも手元のマシン(Redhat Linux 7.3)ではデフォルトの暗号化手法はMD5らしい。

もしDESで作りたい場合はやはり自前で2文字生成する必要がありそう。

最終更新時刻: 2008年03月04日
コメント(4) [コメントを投稿する]

Before...

_ hajime [これは便利ですね。自前でランダムな2文字を用意するとコードが長くなるので避けたかったんですが、これなら逆に短くなりま..]

_ なかみつ [あうっ〜.PHPは殆どSolarisで使っていたのでsalt省略したらてっきりDESされるものかと思ってました(^^..]

_ hajime [こうなったらシステムの暗号化方式を変えるしか!(違) crypt関数で暗号化方式を指定できたらいいのに・・・]