2016-04-09 19 views
0

私はUnity Client - PHP Server - Database integrationのオンラインチュートリアルを1年続けました。コードは正常に実行されているようだが、それは "エコー"成功 "のラインなどに完全に到達する。PHPコードは実行されていますが、データは挿入されていませんか?

私のデータベースを見ると、そこには何もありません。その空白、と私は理由が分からない。

注:オンラインチュートリアルではmysqlを使用していましたが、私は(非忌避型の)mysqliを使用していましたが、それほど違いはないようですが、私はトータルルーキーです私は間違っている可能性が非常に可能ですので、PHPコーディングでは、それに最小限の経験を持つだけ?

<?php 
/** 
* Created by PhpStorm. 
* User: Josh 
* Date: 09/04/2016 
* Time: 14:11 
*/ 

$Username = $_REQUEST["Username"]; 
$Password = $_REQUEST["Password"]; 

$Hostname = "localhost"; 
$DBName = "statemilitaryrpdb"; 
$User = "root"; 
$PasswordP = ""; 

$link = mysqli_connect($Hostname, $User, $PasswordP, $DBName) or die ("Can't Connect to DB"); 
if (!$Username || !$Password) { 
    echo "Empty"; 
} else 
{ 
     $SQL = "SELECT * FROM accounts WHERE Username = '" . $Username ."'"; 
     $Result = @mysqli_query($link, $SQL) or die ("DB ERROR"); 
     $Total = mysqli_num_rows($Result); 
     if($Total == 0) 
     { 
      $insert = "INSERT INTO 'accounts' ('Username', 'Password') VALUES ('" .$Username . "', MD5('" . $Password . "'), 0)"; 
     $SQL1 = mysqli_query($link, $insert); 
     $Result2 = @mysqli_query($link, $SQL) or die ("DB ERROR"); 
     echo(mysqli_num_rows($Result2)); 
    } 
    else 
    { 
     echo"Username Already Used"; 
    } 
} 

mysqli_close($link); 
+3

あなたのインサートには2つのカラムがありますが、3つの値があります。また、挿入を行う行のエラーチェックもありません。 – andrewsi

答えて

1

まず、あなたのクエリにのみ2列を持っていますが、3つの値を挿入されています

を挿入する

$insert = "INSERT INTO 'accounts' ('Username', 'Password') VALUES ('" .$Username . "', MD5('" . $Password . "'), 0)"; 

  • ユーザー名
  • パスワード

値を

  • $ユーザー名
  • MD5($パスワード)

したがって、いないすべての値が挿入されます。


第2に、MySQL関連の名前の場合は、一重引用符ではなくバックティックを使用する必要があります。

したがって、この:

INSERT INTO 'accounts' 

は次のようになります。

INSERT INTO `accounts` 

第三に、あなたのコードは、MySQLインジェクションに対して脆弱である、あなたはmysqli_real_escape_string()を使用して、それを防ぐ必要があります。

$Username = mysqli_real_escape_string($link, $_REQUEST["Username"]); 
$Password = mysqli_real_escape_string($link, $_REQUEST["Password"]); 

ヒント:あなたは、エラーメッセージを抑制べきではありません。

@mysqli_query($link, $SQL) 

は、エラー報告を有効にする@を削除します。構文エラーの診断に非常に役立ちます。


また、安全性が低いので、パスワードをハッシュするためにmd5()を使用しないでください。代わりにpassword_hashpassword_verifyを使用してください。

+0

非常に助けてくれてありがとうございます。私は、SQLインジェクションの脆弱性などがすべて私にとって新しいものであるため、以前はセキュリティに対処していたことはありませんでした。他に何を探すべきかについてのヒントはありますか(これはデータベース/サーバー、私はそれをすぐに大きく拡大するつもりだ) – NeoKuro

+0

@ NeoKuroよろしくお願いします!ありがとう:) – Panda

2
$insert = "INSERT INTO 'accounts' ('Username', 'Password') VALUES ('" .$Username . "', MD5('" . $Password . "'), 0)"; 

回答:ユーザー名とパスワードがフィールドですが、あなたはユーザ名、パスワード、および0

提案を挿入しようとしている:ちょうどMD5暗号化よりも多くの操作を行い、それが解読するSUPER簡単です。

編集: また@andrewsiのコメントでは、誰かがSQLをデータベースに挿入してテーブルを削除したり変更したりすることができるかどうかを確認するために、その空きがあるかどうかをチェックします。入力を正しくフィルタリングしていることを確認してください。

+0

また、準備されたステートメントの使用に関するメモを追加することもできます。これは現在、SQLインジェクションに広く開かれています – andrewsi

0

デバッグモードでは、@を使用してエラーを抑制しないでください。 @mysqli_query。また、or die("DB ERROR")はあまり説明的ではありません。それが解決しても、何が良いのですかDB ERRORはあなたに何を提供しますか?代わりに、or die(mysqli_error($link))を使用して、実際にクエリで何が起こっているのかを確認してください。

あなたはまた、3つの値を挿入する必要が、しかし、唯一の2列は、クエリ文で表される:

('Username', 'Password') // 2 columns 

VALUES ('" .$Username . "', MD5('" . $Password . "'), 0)"; // 3 values 

何列0が挿入されていますか?この値は列で表される必要があります。

テーブル名とカラム名は決して引用符で囲むべきではありません。 `accounts`にのみダックを入れます

関連する問題