Jump to content
Unity Insider Forum

datenbank sicherung ausreichend?


dewa

Recommended Posts

Hallo zusammen,  ich habe relativ wenig Ahnung wenn es um die Sicherheit von Datenbank zugriffen geht.

Ich habe mir folgendes gedacht. Ich erstelle ein Hash was sich aus   Username,Passwort,Salt, und einem Timestamp von der Datenbank zusammensetzt.

Also bevor man Scripte aufruft, die wichtige Funktionen haben wird erst mal der Timestamp geholt von dem letzden Datenbank zugriff.

C#

public init_regist init_regist;
public hash_test hash_test;


	public void OnTriggerEnter(Collider Other)
	{
		StartCoroutine(server_ts(init_regist.Username,init_regist.Passwort));
	}

	public IEnumerator server_ts( string Username,string Passwort)
	{

		WWWForm form = new WWWForm();

		form.AddField("username", Username);
		form.AddField("passwort", Passwort);


		WWW webRequest = new WWW("http://hostin(.................).net/last_login.php", form);
		yield return webRequest;

		if (webRequest.text != null)
		{
			hash_test.last_login_ts = (int.Parse(webRequest.text));
	
			hash_test.createhashtest ();
		}
		else {
			Debug.Log(webRequest.text);
		}

	}

php:

<?php
$servername = "hahah";
$un = "hihihi";
$pw = "hohoho";
$dbname = "hehehe";
$eingelogt =false;

$username = $_POST["username"]; 
$passwort = $_POST["passwort"]; 


$last_login_server= 0;




$conn = new mysqli($servername, $un, $pw, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}


$param = $username;
$stmt = $conn->prepare("SELECT passwort FROM i(...)t WHERE username LIKE ?");
$stmt->bind_param("s", $param);
$stmt->execute();
$stmt->bind_result($passwort2);

while ($stmt->fetch()) {

if($passwort2==$passwort)
{
$eingelogt = true;
}else{
echo "error";
$stmt->close();
$conn->close();
}
}

$param = $username;
$stmt = $conn->prepare("SELECT last_login FROM i(...)t WHERE username LIKE ?");
$stmt->bind_param("s", $param);
$stmt->execute();
$stmt->bind_result($last_login_server);

while ($stmt->fetch()) {
echo ($last_login_server);
}


$conn->close();
?>  

Nachdem das C# Script den Timestamp hat wird der Hash in Unity generiert. Und zum Server geschickt.

public init_regist init_regist;
	public hash_helper hash_helper;
	public trigger_ts trigger_ts;

	public static int last_login_ts;
    static string salt = "|husdhuisdh";
  
	public void createhashtest()
	{
	    string securehash = init_regist.Username+init_regist.Passwort+salt+last_login_ts ;
		string hash = hash_helper.Md5Sum (securehash);
		Debug.Log (hash);
		StartCoroutine(sichere_con(init_regist.Username, init_regist.Passwort, hash));
	}
	public IEnumerator sichere_con( string Username, string Passwort, string hash)
	{
		WWWForm form = new WWWForm();
		form.AddField("username", Username);
		form.AddField("passwort", Passwort);
		form.AddField("hash", hash);
      
		WWW webRequest = new WWW("http://hos(.......)h_test.php", form);
		yield return webRequest;

		if (webRequest.text != null)
		{

			Debug.Log("securehash php :" +webRequest.text);
		}
		else {
			Debug.Log(webRequest.text);
		}
	}

 

zum Php Script:

<?php
$servername = "........";
$un = ".....";
$pw = ".......";
$dbname = "......";
$eingelogt =false;

$username = $_POST["username"]; 
$passwort = $_POST["passwort"]; 
$csharphash= $_POST["hash"]; 


$salt= "|husdhuisdh";

$last_login_server= 0;
$last_login_server_neu= time();
$belastung=0;
$securehash= "test";

$conn = new mysqli($servername, $un, $pw, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$param = $username;
$stmt = $conn->prepare("SELECT passwort FROM i(.....)t WHERE username LIKE ?");
$stmt->bind_param("s", $param);
$stmt->execute();
$stmt->bind_result($passwort2);

while ($stmt->fetch()) {

if($passwort2==$passwort)
{
$eingelogt = true;
}else{
echo "falsches PW";
$stmt->close();
$conn->close();
}
}

$param = $username;
$stmt = $conn->prepare("SELECT last_login FROM i(....)t WHERE username LIKE ?");
$stmt->bind_param("s", $param);
$stmt->execute();
$stmt->bind_result($last_login_server);

while ($stmt->fetch()) {
$securehash = $_POST["username"].$_POST["passwort"].$salt.$last_login_server;

if (md5($securehash) === ($csharphash) ) {
//DO STUFF!
echo "ES KLAPPT";
}else{

$stmt->close();
$conn->close();
}
}

$stmt = $conn->prepare("UPDATE i(....)t SET last_login=? WHERE username = ?");
$stmt->bind_param('ss',
$last_login_server_neu,
$username);

$stmt->execute();
$conn->close();

?>  
 

 

Und zuletzt noch die Hash helper Class womit der Hah erzeugt wird.

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

 

Ich merke grade das es sehr viel Code ist, sorry aber wollte lieber mal den kompletten ablauf posten.

Ist das mit dem Hash + Timestamp so in Ordnung? 

Reicht das als Sicherheit aus??

 

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also, mal grundsätzlich:

"Never trust the client!"

- Der Client sollte keinen Hash generieren. Sondern den Hash generiert der Server und schickt ihn an den Client und der Client authorisiert sich damit am Server.

- Den Hash würde ich auch rein zufällig generieren lassen und nicht aus Daten, die man theoretisch in Erfahrung bringen könnte (also Username, Passwort, etc).

- Soweit ich das sehe, schickst du das Passwort im Klartext durchs Netz. Das sollte man, wenn möglich, schon gleich auf dem Client hashen.

- Und das Passwort NIEMALS im Klartext in der DB speichern. (sieht so aus, als machst du das)

- Warum du "WHERE username LIKE ?" machst, ist nicht nachzuvollziehen.

Ich glaube, du solltest dich erst mal ein bisschen in Client/Server Kommunikation (mit Schwerpunkt PHP) aufschlauen, bevor du das "produktiv" einsetzt.

Du kannst mich da gerne mal direkt anhauen. Das führt im Forum wahrscheinlich etwas zu weit und ist ja auch thematisch eher nicht so passend.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 5 months later...

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...