Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách kết nối với cơ sở dữ liệu từ Unity

Vui lòng bỏ qua mọi rủi ro bảo mật với cách tiếp cận này

Đừng làm điều đó như thế này . Không quan trọng là bảo mật sẽ đến trước hay sau. Bạn sẽ kết thúc việc viết lại toàn bộ mã vì mật khẩu được mã hóa cứng trong ứng dụng của bạn, có thể được dịch ngược và truy xuất dễ dàng . Thực hiện kết nối đúng cách ngay bây giờ để bạn không phải viết lại toàn bộ ứng dụng.

Chạy lệnh cơ sở dữ liệu của bạn trên máy chủ của bạn bằng php, perl hoặc bất kỳ ngôn ngữ nào bạn cảm thấy thoải mái nhưng điều này phải được thực hiện trên máy chủ.

Từ Unity, sử dụng WWW hoặc UnityWebRequest lớp để giao tiếp với tập lệnh đó và sau đó, bạn sẽ có thể gửi và nhận thông tin từ Unity đến máy chủ. Có rất nhiều ví dụ ra khỏi đó. Ngay cả với điều này, bạn vẫn cần phải triển khai bảo mật của riêng mình nhưng điều này tốt hơn nhiều so với những gì bạn hiện có.

Bạn cũng có thể nhận nhiều dữ liệu với json.

Dưới đây là một ví dụ đầy đủ từ wiki Unity này. Nó chỉ ra cách tương tác với cơ sở dữ liệu trong Unity bằng php ở phía máy chủ và Unity + C # ở phía máy khách.

Phía máy chủ :

Thêm điểm với 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>';
            }
        } 
?>
 

Lấy điểm với 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";
        }
    }
?>
 

Bật chính sách tên miền chéo trên máy chủ :

Tệp này phải được đặt tên là "crossdomain.xml" và được đặt trong thư mục gốc của máy chủ web của bạn. Unity yêu cầu các trang web bạn muốn truy cập thông qua Yêu cầu WWW phải có chính sách tên miền chéo.

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

Phía khách hàng / phía thống nhất :

Mã máy khách từ Unity kết nối với máy chủ, tương tác với PDO và thêm hoặc lấy điểm tùy thuộc vào hàm nào được gọi. Mã ứng dụng này được sửa đổi một chút để biên dịch với phiên bản Unity mới nhất.

 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');
}
 

Đây chỉ là một ví dụ về cách làm đúng cách. Nếu bạn cần triển khai tính năng phiên và quan tâm đến bảo mật, hãy xem xét OAuth 2.0 giao thức. Phải có các thư viện hiện có sẽ giúp bắt đầu với OAuth giao thức.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạo cơ sở dữ liệu theo chương trình trong SQL Server

  2. Cách sử dụng tìm kiếm ngữ nghĩa trong SQL Server

  3. Tìm thứ tự nút trong tài liệu XML trong SQL Server

  4. Truy xuất theo chương trình nguồn thủ tục được lưu trữ của SQL Server giống với nguồn được trả về bởi SQL Server Management Studio gui?

  5. varchar (500) có lợi thế hơn so với varchar (8000)?