こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

MD5ハッシュのデータが

<?
include "config.php";

$Data = '<form action=register.php method=post>
Login: <br><input type=text name=login><br><br>
Password:<br><input type=password name=passwd><br><br>
Repeat password:<br><input type=password name=repasswd><br><br>
Email:<br><input type=text name=email><br><br>
<input type=submit name=submit value="Registration">
</form>';

if (isset($_POST['login'])) {
$Link = MySQL_Connect($DBHost, $DBUser, $DBPassword) or die ("Can't connect to MySQL");
MySQL_Select_Db($DBName, $Link) or die ("Database ".$DBName." do not exists.");

$Login = $_POST['login'];
$Pass = $_POST['passwd'];
$Repass = $_POST['repasswd'];
$Email = $_POST['email'];
$Login = StrToLower(Trim($Login));
$Pass = StrToLower(Trim($Pass));
$Repass = StrToLower(Trim($Repass));
$Email = Trim($Email);

if (empty($Login) || empty($Pass) || empty($Repass) || empty($Email)) {
echo "All fields is empty.";
}
elseif (ereg("[^0-9a-zA-Z_-]", $Login, $Txt)) {
echo "Login have a incorrect format.";
}
elseif (ereg("[^0-9a-zA-Z_-]", $Pass, $Txt)) {
echo "Password have a incorrect format.";
}
elseif (ereg("[^0-9a-zA-Z_-]", $Repass, $Txt)) {
echo "Repeat password have a incorrect format.";
}
elseif (StrPos('\'', $Email)) {
echo "Email have a incorrect format.";
}
else {
$Result = MySQL_Query("SELECT name FROM users WHERE name='$Login'") or ("Can't execute query.");

if (MySQL_Num_Rows($Result)) {
echo "Account <b>".$Login."</b> is exists";
}
elseif ((StrLen($Login) < 4) or (StrLen($Login) > 10)) {
echo "Login must have more 4 and not more 10 symbols.";
}
elseif ((StrLen($Pass) < 4) or (StrLen($Pass) > 10)) {
echo "Password must have more 4 and not more 10 symbols.";
}
elseif ((StrLen($Repass) < 4) or (StrLen($Repass) > 10)) {
echo "Repeat password must have more 4 and not more 10 symbols.";
}
elseif ((StrLen($Email) < 4) or (StrLen($Email) > 25)) {
echo "Email must have more 4 and not more 25 symbols.";
}
elseif ($Pass != $Repass){
echo "Password mismatch.";
}

else {
$Salt = $Login.$Pass;
$Salt = md5($Salt);
$Salt = "0x".$Salt;

MySQL_Query("call adduser('$Login', $Salt, '0', '0', '0', '0', '$Email', '0', '0', '0', '0', '0', '0', '0', '', '', $Salt)") or die ("Can't execute query.");

echo "Account <b>".$Login."</b> has been registered.";
}
}
}
echo $Data;
?>

上のスクリプトで登録をしてphpmyadminで登録されたデータを見ると、
パスワードが空になっていたり文字が化けた1文字とかになって書き込まれています。
PHP上で何か問題があるのかと
<?php
$str = 'test';
if (md5($str) === '098f6bcd4621d373cade4e832627b4f6'){
eco "MD5OK";
exit;
}
?>
のように書いてみると正常にMD5OKと出ますのでデータベース側に問題があるような気がします。
どうしたら正常に書き込まれるようになるか分かる方いらっしゃいませんでしょうか?

投稿日時 - 2009-05-01 11:01:10

QNo.4922772

困ってます

質問者が選んだベストアンサー

格納方法に問題があるからでしょう
$Salt = "0x".$Salt;
こっれて、16進数にわざわざ変換して、何型カラムに格納してるのでしょう?
桁も大きいし、格納できる整数の範囲逸脱=格納前に既に正しい値ではない可能性があります。
かりに、MySQLのnumeric型でうまく格納出来たとしても、phpで取り出した際に、phpの扱える範囲ではないので、数値表示出来ません。よって、比較対象にも使えません。
カラム型をvarchar(32)として、 md5($Salt)を文字列で格納すれば、同じ値をそのまま文字列で取り出せるはずです。そうすれば比較も容易です。

投稿日時 - 2009-05-01 17:40:25

補足

そのあたり書いてなかったですね。すいません。
パスワードはvarchar(64)になっていました。
もともとデータベースもそれを使うスクリプトも他人が作ったもので
上記のDBへの登録のスクリプトも多少手を加えた程度なんですが、
このDBを使うスクリプトの方がセキュリティを考慮してなのか理由はわかりませんが16進数から変換して読み込むようになってるのかもしれません。
上記の登録のスクリプト以外はモジュールとして多数のスクリプトが組み込まれて動くみたいでかなり複雑なので私の知識ではその部分がどうなっているのか確かめることも厳しいですが16進数に変換しないでも使えるようにならないかいろいろ試してみます。
ありがとうございました。

投稿日時 - 2009-05-02 09:43:40

お礼

補足の部分にお礼を書いてしまってました;;

投稿日時 - 2009-05-02 10:21:25

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)