sql >> データベース >  >> RDS >> Sqlserver

Unityからデータベースに接続する方法

    このアプローチによるセキュリティリスクは無視してください

    このようにしないでください 。セキュリティが前に来るか後に来るかは関係ありません。 パスワードがあるため、コード全体の書き直しは終了します。 アプリケーションにハードコーディングされており、簡単に逆コンパイルおよび取得できます。 。アプリケーション全体を書き直す必要がないように、今すぐ正しい方法で接続してください。

    サーバー上でphp、perl、または使い慣れた言語を使用してデータベースコマンドを実行しますが、これはサーバー上で実行する必要があります。

    Unityから、WWWを使用します またはUnityWebRequest そのスクリプトと通信するためのクラスを作成すると、Unityとサーバーの間で情報を送受信できるようになります。そこには多くの例があります。これでも、独自のセキュリティを実装する必要がありますが、これは現在のセキュリティよりもはるかに優れています。

    jsonで複数のデータを受信することもできます。

    以下は、このUnitywikiの完全な例です。サーバー側でphpを使用し、クライアント側でUnity + C#を使用してUnityのデータベースと対話する方法を示しています。

    サーバー側

    PDOでスコアを追加

     <?php
            // Configuration
            $hostname = 'localhot';
            $username = 'yourusername';
            $password = 'yourpassword';
            $database = 'yourdatabase';
    
            $secretKey = "mySecretKey"; // Change this value to match the value stored in the client javascript below 
    
            try {
                $dbh = new PDO('mysql:host='. $hostname .';dbname='. $database, $username, $password);
            } catch(PDOException $e) {
                echo '<h1>An error has ocurred.</h1><pre>', $e->getMessage() ,'</pre>';
            }
    
            $realHash = md5($_GET['name'] . $_GET['score'] . $secretKey); 
            if($realHash == $hash) { 
                $sth = $dbh->prepare('INSERT INTO scores VALUES (null, :name, :score)');
                try {
                    $sth->execute($_GET);
                } catch(Exception $e) {
                    echo '<h1>An error has ocurred.</h1><pre>', $e->getMessage() ,'</pre>';
                }
            } 
    ?>
     

    PDOでスコアを取得する

     <?php
        // Configuration
        $hostname = 'localhost';
        $username = 'yourusername';
        $password = 'yourpassword';
        $database = 'yourdatabase';
    
        try {
            $dbh = new PDO('mysql:host='. $hostname .';dbname='. $database, $username, $password);
        } catch(PDOException $e) {
            echo '<h1>An error has occurred.</h1><pre>', $e->getMessage() ,'</pre>';
        }
    
        $sth = $dbh->query('SELECT * FROM scores ORDER BY score DESC LIMIT 5');
        $sth->setFetchMode(PDO::FETCH_ASSOC);
    
        $result = $sth->fetchAll();
    
        if(count($result) > 0) {
            foreach($result as $r) {
                echo $r['name'], "\t", $r['score'], "\n";
            }
        }
    ?>
     

    サーバーでクロスドメインポリシーを有効にする

    このファイルには「crossdomain.xml」という名前を付けて、Webサーバーのルートに配置する必要があります。 Unityでは、WWWリクエストを介してアクセスするWebサイトにクロスドメインポリシーが必要です。

     <?xml version="1.0"?>
    <cross-domain-policy>
    <allow-access-from domain="*"/>
    </cross-domain-policy>
     

    クライアント/ユニティサイド

    Unityのクライアントコードはサーバーに接続し、PDOと対話し、呼び出された関数に応じてスコアを追加または取得します。このクライアントコードは、最新のUnityバージョンでコンパイルできるように少し変更されています。

     private string secretKey = "mySecretKey"; // Edit this value and make sure it's the same as the one stored on the server
    public string addScoreURL = "http://localhost/unity_test/addscore.php?"; //be sure to add a ? to your url
    public string highscoreURL = "http://localhost/unity_test/display.php";
    
    //Text to display the result on
    public Text statusText;
    
    void Start()
    {
        StartCoroutine(GetScores());
    }
    
    // remember to use StartCoroutine when calling this function!
    IEnumerator PostScores(string name, int score)
    {
        //This connects to a server side php script that will add the name and score to a MySQL DB.
        // Supply it with a string representing the players name and the players score.
        string hash = Md5Sum(name + score + secretKey);
    
        string post_url = addScoreURL + "name=" + WWW.EscapeURL(name) + "&score=" + score + "&hash=" + hash;
    
        // Post the URL to the site and create a download object to get the result.
        WWW hs_post = new WWW(post_url);
        yield return hs_post; // Wait until the download is done
    
        if (hs_post.error != null)
        {
            print("There was an error posting the high score: " + hs_post.error);
        }
    }
    
    // Get the scores from the MySQL DB to display in a GUIText.
    // remember to use StartCoroutine when calling this function!
    IEnumerator GetScores()
    {
        statusText.text = "Loading Scores";
        WWW hs_get = new WWW(highscoreURL);
        yield return hs_get;
    
        if (hs_get.error != null)
        {
            print("There was an error getting the high score: " + hs_get.error);
        }
        else
        {
            statusText.text = hs_get.text; // this is a GUIText that will display the scores in game.
        }
    }
    
    public string Md5Sum(string strToEncrypt)
    {
        System.Text.UTF8Encoding ue = new System.Text.UTF8Encoding();
        byte[] bytes = ue.GetBytes(strToEncrypt);
    
        // encrypt bytes
        System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
        byte[] hashBytes = md5.ComputeHash(bytes);
    
        // Convert the encrypted bytes back to a string (base 16)
        string hashString = "";
    
        for (int i = 0; i < hashBytes.Length; i++)
        {
            hashString += System.Convert.ToString(hashBytes[i], 16).PadLeft(2, '0');
        }
    
        return hashString.PadLeft(32, '0');
    }
     

    これは、これを適切に行う方法の単なる例です。セッション機能を実装してセキュリティを気にする必要がある場合は、 OAuth 2.0を調べてください。 プロトコル。 OAuthの使用を開始するのに役立つ既存のライブラリが必要です。 プロトコル。



    1. PostgreSQLデータベースのすべてのビューを一覧表示する方法

    2. SQLServerの結果セットのパーセンテージを返す

    3. SQLServerフェールオーバークラスター内のシステムデータベースの移動

    4. Postgresがサブクエリをインライン化するのを防ぐにはどうすればよいですか?