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

投稿日: 2004年03月04日 更新日: 2017年07月22日

単発のバイト

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

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

Subversion 1.0.0 on Debian

Subversion 1.0.0 on Debian - wakatonoの戯れメモ

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文字生成する必要がありそう。


この記事へのコメント

※ このコメントは旧ブログシステム(tDiary)からの移行です。

なかみつさんからのコメント(2004-03-05 00:51:10)

細かいことですが,$saltはランダムな2文字にしたほうがよろしいかと.crypt()の二番目の引数が無い場合,自動的にsaltを作成してくれるので便利です.

hajimeさんからのコメント(2004-03-05 02:16:22)

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

なかみつさんからのコメント(2004-03-05 10:12:53)

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

hajimeさんからのコメント(2004-03-05 10:27:57)

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

名前:宮内 はじめ

Code for Nagoya名誉代表

E2D3名古屋支部長

プログラマーです。GISやデータビズが好きです。このサイトは宮内の個人的なメモです。

プロフィール

お問い合わせ