Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Autoryzacja


eXnR

Rekomendowane odpowiedzi

Opublikowano

Siema.
 
Zrobiłem sobie prostą autoryzację, czyli żeby uzyskać dostęp do programu trzeba się zalogować. C#(request) - PHP - MySql
I obecnie mam zrobione tak, że po zalogowaniu strona przechodzi do podstrony index.php i stamtąd pobierany jest kod strony i jeśli jest ok (1) to otwiera się form2 z właściwym programem.
Wydaje mi się, że to rozwiązanie jest słabe, jak to zrobić lepiej? 
+ drugie pytanie: 
Chciałbym zrobić dodatkowe zabezpieczenie i wymyśliłem sobie, żeby pobierać np. adres ip i przypisywać go do danego użytkownika w bazie (przy pierwszym logowaniu), a jeśli przy następnym logowaniu będzie inny, użytkownik nie będzie mógł się zalogować. Wiem że to rozwiązanie jest słabe, bo użytkownik może mieć np zmienne ip, ale to taki pierwszy lepszy pomysł. Jak to zrobić? (Oczywiście nie obrażę się jeśli podacie inny, zapewne lepszy sposób.)
 
A tutaj kod logowania php: 

<?php include("config.php"); ?>
<?php
$login = $_POST['login'];
$haslo = $_POST['haslo'];
$haslo = addslashes($haslo);
$login = addslashes($login);
$login = htmlspecialchars($login);

if ($_GET['login'] != '') { //jezeli ktos przez adres probuje kombinowac
exit;
}
if ($_GET['haslo'] != '') { //jezeli ktos przez adres probuje kombinowac
exit;
}

$haslo = md5($haslo); //szyfrowanie hasla
    if (!$login OR empty($login)) {
include("head2.php");
echo '<p class="alert">Wypełnij pole z loginem!</p>';
include("foot.php");
exit;
}
    if (!$haslo OR empty($haslo)) {
include("head2.php");
echo '<p class="alert">Wypełnij pole z hasłem!</p>';
include("foot.php");
exit;
}
$istnick = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM `uzytkownicy` WHERE `nick` = '$login' AND `haslo` = '$haslo'")); // sprawdzenie czy istnieje uzytkownik o takim nicku i hasle
    if ($istnick[0] == 0) {
echo 'Logowanie nieudane. Sprawdź pisownię nicku oraz hasła.';
    } else {

$_SESSION['nick'] = $login;
$_SESSION['haslo'] = $haslo;

header("Location: indeks.php");
}
?>

login.php

<form method="POST" action="login.php">

</form>

(źródło: http://www.forumweb.pl/porady-i-tutoriale-www/php-mysql-logowanie-rejestracja-na-sesjach-zabezpiecze,46976?postdays=0&postorder=helpful&start=0)
I logowanie c# 
 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var ciastka = new CookieContainer();
             var request =
                System.Net.WebRequest.Create(
                    "http://strona.pl/login.php") as
                HttpWebRequest; 
            request.Method = "POST"; 
            request.ContentType = "application/x-www-form-urlencoded";
            request.CookieContainer = ciastka;
            request.Referer = "http://strona.pl/logowanie.php";
            using (var stream = request.GetRequestStream()) 
            {
                byte[] buffer =
                    Encoding.UTF8.GetBytes(
                        string.Format(
                            "login={0}&haslo={1}",
                            textBox1.Text,textBox2.Text)); 
                stream.Write(buffer, 0, buffer.Length); 
            }
            using (var response = request.GetResponse() as HttpWebResponse)
            {
                ciastka.Add(response.Cookies);
                using (var sr = new System.IO.StreamReader(response.GetResponseStream()))
                {
                    string kodStrony = sr.ReadToEnd();
                    MessageBox.Show(kodStrony, "");
                }
            }
        }
    }
}

linki w górę

Opublikowano

Lepszym rozwiązaniem byłoby pobieranie ID procesora.

 

Prędzej ID dysku twardego albo płyty głównej, a nie procesora ;d Poczytaj o HWID.

 

@eXnR

 

1. Robisz to bardzo źle. Używasz w PHP mysql, które zostało zdeprecjonowane, a jakby tego było mało narażasz się na SQL Injection, poczytaj lepiej.

2. Nie uchronisz żadnej aplikacji od nieautoryzowanego dostępu, twoje logowanie można bez problemu wyemulować, więc... useless..

 

 

Nie możesz po prostu połączyć się bezpośrednio z programu z bazą danych zamiast kombinować dookoła?

 

Najgorsze co mógłby zrobić..

Opublikowano

Prędzej ID dysku twardego albo płyty głównej, a nie procesora ;d Poczytaj o HWID.

 

@eXnR

 

1. Robisz to bardzo źle. Używasz w PHP mysql, które zostało zdeprecjonowane, a jakby tego było mało narażasz się na SQL Injection, poczytaj lepiej.

2. Nie uchronisz żadnej aplikacji od nieautoryzowanego dostępu, twoje logowanie można bez problemu wyemulować, więc... useless..

1. To jak to zrobić lepiej? Poza tym mi też nie chodzi o jakiś super zaawansowany system, tylko o jakiś prosty, ale też żebym miał możliwość sprawdzenia czy użytkownik nie "oszukuje" i ewentualnej anulacji licencji.

+ samo pobranie nie jest pewnie trudne, ale co dalej? aplikacja ma wysyłać ID do od razu do bazy czy przez serwer? Wydaje mi się że oba rozwiązania są słabe

linki w górę

Opublikowano

Jak coś robić to porządnie, nie?

1. Zamiast funkcji mysql użyj mysqli albo PDO.

2. Używaj tzw. prepared statements, uchronią przed SQL Injection.

3. Architektura sprawdzania licencji leży w twojej kwestii, ale jeśli miałoby to mieć jakiś sens to musiałbyś porządnie zabezpieczyć kod programu (zaciemnienie kodu + spakowanie dobrym packerem), ale niestety i to da się obejść, wystarczy czas i odpowiednia wiedza.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...