2011-08-13 12 views
1

さて、私が言ったように、私はこの種のコードでは全く経験がありません。私は、PHPの非常に基本的な知識と、MySQLの仕組みに関するわずかな印象を知っています。PHP/MySQL登録 - 私はnewbです

だからこれは私がps.niu-niu.org/に行くとき、それはとして表示(星と一緒にブロックされたパスワード)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<title>P.S.</title> 
<link type="text/css" rel="stylesheet" href="http://www.ps.niu-niu.org/ps.css" /> 
</head> 
<body> 
<div id="main"> 
HERE'S THE MAIN PART! 
<?php 

mysql_connect("localhost, "niuniu_ps", "**********") or die(mysql_error()); 

mysql_select_db("niuniu_ps") or die(mysql_error()); 


if (isset($_POST['submit'])) { 



if (!$_POST['username'] | !$_POST['pass'] | !$_POST['pass2']) { 

     die('You did not complete all of the required fields'); 

    } 





    if (!get_magic_quotes_gpc()) { 

     $_POST['username'] = addslashes($_POST['username']); 

    } 

$usercheck = $_POST['username']; 

$check = mysql_query("SELECT username FROM users WHERE username = '$usercheck'") 

or die(mysql_error()); 

$check2 = mysql_num_rows($check); 





if ($check2 != 0) { 

     die('Sorry, the username '.$_POST['username'].' is already in use.'); 

       } 




    if ($_POST['pass'] != $_POST['pass2']) { 

     die('Your passwords did not match. '); 

    } 





    $_POST['pass'] = md5($_POST['pass']); 

    if (!get_magic_quotes_gpc()) { 

     $_POST['pass'] = addslashes($_POST['pass']); 

     $_POST['username'] = addslashes($_POST['username']); 

      } 





    $insert = "INSERT INTO users (username, password) 

      VALUES ('".$_POST['username']."', '".$_POST['pass']."')"; 

    $add_member = mysql_query($insert); 

    ?> 




<h1>Registered</h1> 

<p>Thank you, you have registered - you may now login</a>.</p> 

<?php 
} 

else 
{ 
?> 



<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> 

<table border="0"> 

<tr><td>Username:</td><td> 

<input type="text" name="username" maxlength="60"> 

</td></tr> 

<tr><td>Password:</td><td> 

<input type="password" name="pass" maxlength="10"> 

</td></tr> 

<tr><td>Confirm Password:</td><td> 

<input type="password" name="pass2" maxlength="10"> 

</td></tr> 

<tr><th colspan=2><input type="submit" name="submit" 
value="Register"></th></tr> </table> 

</form> 


<?php 

} 
?> 

</div> 
<div id="reflection"></div> </body> 

を使用しているコードです:解析エラー:構文エラー、ライン27

+0

27行はどこですか? – deceze

+0

質問を読む前にコードを編集しましたが、私はエラーを編集したと思います。 mysql_connect関数でlocalhostの後ろに二重引用符( ")を忘れてしまっていますが、27行目ではありませんが、正しい場合には27行目でコードに空白行が表示されます –

+0

また、' | 'はビットまたは演算子、 –

答えて

1

「これはなぜ動作しないのですか」という質問には具体的には答えていませんが、より深刻な問題に対処しています。システム全体に大きなセキュリティホールがあります。申し訳ありませんが、それは本当です。

$insert = "INSERT INTO users (username, password) 

      VALUES ('".$_POST['username']."', '".$_POST['pass']."')"; 

    $add_member = mysql_query($insert); 

パスワードは暗号化されていないプレーンテキストとしてデータベースに挿入されているようです。これは非常に悪い考えです。データベースが何らかの形で侵害された場合、すべてのユーザーのパスワードはすぐそこにあり、簡単に盗まれる可能性があります。ほとんどのユーザーは多くのサイトで同じパスワードを使用するため、自分のサイトが侵害されるだけでなく、他のサイトへのユーザーの資格情報も同様に影響を受ける可能性があります。

さらに、コードはSQL injectionに公開されています。ユーザー名を確認するときに入力を害さないように何もしていません。攻撃者がユーザー名の代わりにユーザー名ボックスにコードを挿入し、すべてのデータベースレコードを取得するのは簡単です。我々は' or '1'='1としてユーザー名を設定した場合、クエリは次のようになります。

SELECT username FROM users WHERE username = '' or '1'='1' 

これは、すべてのユーザ名を返し、脆弱性は、あなたの暗号化されていないパスワードのすべてを明らかに更なる虐待を受けたかもしれません!

問題の事実は、多くの開発者は、多くのデベロッパー—でさえも、自分自身のデータを持っている人でも、あなたの顧客のデータを処理するために非常に安全な方法ではなく、公平な経験をして、— store passwords incorrectlyの前にPHPをほとんど使用していない人はもちろんです。あなたのアプリケーションの安全性とカスタム認証システムの作成をスクラッチして、確立され、機能しているものを使用することの両方にとって、はるかに安全です。 PHP libraries for user authenticationにスタックオーバーフローポストがあります(自分のロールを言う人に耳を傾けないでください - 自分の例は脆弱性が蔓延していることを証明します)。

+0

これはすべて当てはまりますが、元の質問にはまったく関連していないので、質問への受け入れ可能な回答は「これは具体的にあなたの質問に答えるものではありません」からどうやって始めることができますか? –

+0

@NightOwl質問質問者は受け入れられた回答を選択します。あなたの答えは確かに "なぜ私はこのエラーを受けているのですか"という暗黙の質問に解決策を提供しますが、オリジナルの質問は質問をしません - ちょうどコードとエラーをダンプします。私の答えは、コードブロック全体が危険であるという、もっと重要な問題を指摘しています。質問者はおそらくそれがより重要なフィードバックであると感じていたでしょう。それはより大きな画像を見ることの問題です。 – nhinkle

3

に/home/niuniu/public_html/ps/index.phpの予想外のT_STRINGは、あなたの接続文字列でlocalhostの周りに引用符が欠落しているように見えます...

mysql_connect("localhost, "niuniu_ps", "**********") or die(mysql_error()); 

はする必要があります。 ..

また
mysql_connect("localhost", "niuniu_ps", "**********") or die(mysql_error()); 

この行...

if (!$_POST['username'] | !$_POST['pass'] | !$_POST['pass2']) { 

は...

if (!$_POST['username'] || !$_POST['pass'] || !$_POST['pass2']) { 

単一のパイプは、ビット演算子であり、文句を言わない期待される結果を与えるべきです。おそらくあなたのエラーに関連していません。

関連する問題