Scripts

Login systeem

Aantal mappen nodig: 4 Aantal bestanden: 13 Om dit script te laten werken, moet je de volgende mappen aanmaken: -modules -procedures -talen -style ------------------------- De mappen bevatten de volgende bestanden: modules: -encryption.js -index.php (leeg bestand) procedures: -geldig_ip.php -index.php (leeg bestand) -maak_functies.php talen: -nl.php -index.php (leeg bestand) style: login.css In de rootmap: -configuratie.php -controle.php -index.php -index2.php -uitloggen.php Uitvoeren in de database: database.sql -------------------------- Ik heb bij dit loginsysteem gekozen voor de pagina: index2.php inplaats van een map home/index.php of iets dergelijks, om het makkelijker te houden. Zou je dit script in gebruik nemen, raad ik wel aan om een andere map aan te maken, anders wordt alles onoverzichtelijk. Het systeem gebruikt mysql_real_escape_string tegenover SQL injecties. Tegen XSS injecties is gekozen om geen gegevens te onthouden bij een foute login. Tegen man in the middle is gekozen voor een javascript hash van het wachtwoord, zodat het wachtwoord niet in 'plain text' kan worden onderschept. En het script heeft een challenge/response om te controleren of de gebruiker wel de echte persoon is. De lege index.php bestanden in elke map is om path traversal te voorkomen. Het script gebruikt SHA512 om wachtwoorden tijdelijk te coderen. Het script is gebruikt als login voor enkele personen, er is geen wachtwoordvergeten/register script bij gesloten. Het wachtwoord zal in de vorm van: "laJx6HsXNQris" worden gemaakt. EDIT: 'Tegen XSS injecties is gekozen om geen gegevens te onthouden bij een foute login.' moest zijn: Er is gekozen om geen gegevens te onthouden, zodat als iemand fout heeft geantwoord en opzoek gaat naar zijn wachtwoord (misschien opgeschreven oid) dan kan een andere persoon niet zijn gebruikersnaam uitlezen. ADD: Het HTML van de login pagina gevalideerd en goed HTML 5 gemaakt en een css bestand voor de login toegevoegd. Credits: encryption.js = pajhome.org.uk/crypt/md5/

encryption.js
/*
 * A JavaScript implementation of the Secure Hash Algorithm, as defined
 * in FIPS 180-2
 * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for details.
 */

/*
 * Configurable variables. You may need to tweak these to be compatible with
 * the server-side, but the defaults work in most cases.
 */
var hexcase = 0;  /* hex output format. 0 - lowercase; 1 - uppercase        */
var b64pad  = ""; /* base-64 pad character. "=" for strict RFC compliance   */

/*
 * These are the functions you'll usually want to call
 * They take string arguments and return either hex or base-64 encoded strings
 */
function hex_sha512(s)    { return rstr2hex(rstr_sha512(str2rstr_utf8(s))); }
function b64_sha512(s)    { return rstr2b64(rstr_sha512(str2rstr_utf8(s))); }
function any_sha512(s, e) { return rstr2any(rstr_sha512(str2rstr_utf8(s)), e);}
function hex_hmac_sha512(k, d)
  { return rstr2hex(rstr_hmac_sha512(str2rstr_utf8(k), str2rstr_utf8(d))); }
function b64_hmac_sha512(k, d)
  { return rstr2b64(rstr_hmac_sha512(str2rstr_utf8(k), str2rstr_utf8(d))); }
function any_hmac_sha512(k, d, e)
  { return rstr2any(rstr_hmac_sha512(str2rstr_utf8(k), str2rstr_utf8(d)), e);}

/*
 * Perform a simple self-test to see if the VM is working
 */
function sha512_vm_test()
{
  return hex_sha512("abc").toLowerCase() ==
    "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a" +
    "2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f";
}

/*
 * Calculate the SHA-512 of a raw string
 */
function rstr_sha512(s)
{
  return binb2rstr(binb_sha512(rstr2binb(s), s.length * 8));
}

/*
 * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
 */
function rstr_hmac_sha512(key, data)
{
  var bkey = rstr2binb(key);
  if(bkey.length > 32) bkey = binb_sha512(bkey, key.length * 8);

  var ipad = Array(32), opad = Array(32);
  for(var i = 0; i < 32; i++)
  {
    ipad[i] = bkey[i] ^ 0x36363636;
    opad[i] = bkey[i] ^ 0x5C5C5C5C;
  }

  var hash = binb_sha512(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
  return binb2rstr(binb_sha512(opad.concat(hash), 1024 + 512));
}

/*
 * Convert a raw string to a hex string
 */
function rstr2hex(input)
{
  try { hexcase } catch(e) { hexcase=0; }
  var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
  var output = "";
  var x;
  for(var i = 0; i < input.length; i++)
  {
    x = input.charCodeAt(i);
    output += hex_tab.charAt((x >>> 4) & 0x0F)
           +  hex_tab.charAt( x        & 0x0F);
  }
  return output;
}

/*
 * Convert a raw string to a base-64 string
 */
function rstr2b64(input)
{
  try { b64pad } catch(e) { b64pad=''; }
  var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  var output = "";
  var len = input.length;
  for(var i = 0; i < len; i += 3)
  {
    var triplet = (input.charCodeAt(i) << 16)
                | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0)
                | (i + 2 < len ? input.charCodeAt(i+2)      : 0);
    for(var j = 0; j < 4; j++)
    {
      if(i * 8 + j * 6 > input.length * 8) output += b64pad;
      else output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F);
    }
  }
  return output;
}

/*
 * Convert a raw string to an arbitrary string encoding
 */
function rstr2any(input, encoding)
{
  var divisor = encoding.length;
  var i, j, q, x, quotient;

  /* Convert to an array of 16-bit big-endian values, forming the dividend */
  var dividend = Array(Math.ceil(input.length / 2));
  for(i = 0; i < dividend.length; i++)
  {
    dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
  }

  /*
   * Repeatedly perform a long division. The binary array forms the dividend,
   * the length of the encoding is the divisor. Once computed, the quotient
   * forms the dividend for the next step. All remainders are stored for later
   * use.
   */
  var full_length = Math.ceil(input.length * 8 /
                                    (Math.log(encoding.length) / Math.log(2)));
  var remainders = Array(full_length);
  for(j = 0; j < full_length; j++)
  {
    quotient = Array();
    x = 0;
    for(i = 0; i < dividend.length; i++)
    {
      x = (x << 16) + dividend[i];
      q = Math.floor(x / divisor);
      x -= q * divisor;
      if(quotient.length > 0 || q > 0)
        quotient[quotient.length] = q;
    }
    remainders[j] = x;
    dividend = quotient;
  }

  /* Convert the remainders to the output string */
  var output = "";
  for(i = remainders.length - 1; i >= 0; i--)
    output += encoding.charAt(remainders[i]);

  return output;
}

/*
 * Encode a string as utf-8.
 * For efficiency, this assumes the input is valid utf-16.
 */
function str2rstr_utf8(input)
{
  var output = "";
  var i = -1;
  var x, y;

  while(++i < input.length)
  {
    /* Decode utf-16 surrogate pairs */
    x = input.charCodeAt(i);
    y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0;
    if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF)
    {
      x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
      i++;
    }

    /* Encode output as utf-8 */
    if(x <= 0x7F)
      output += String.fromCharCode(x);
    else if(x <= 0x7FF)
      output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F),
                                    0x80 | ( x         & 0x3F));
    else if(x <= 0xFFFF)
      output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
                                    0x80 | ((x >>> 6 ) & 0x3F),
                                    0x80 | ( x         & 0x3F));
    else if(x <= 0x1FFFFF)
      output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
                                    0x80 | ((x >>> 12) & 0x3F),
                                    0x80 | ((x >>> 6 ) & 0x3F),
                                    0x80 | ( x         & 0x3F));
  }
  return output;
}

/*
 * Encode a string as utf-16
 */
function str2rstr_utf16le(input)
{
  var output = "";
  for(var i = 0; i < input.length; i++)
    output += String.fromCharCode( input.charCodeAt(i)        & 0xFF,
                                  (input.charCodeAt(i) >>> 8) & 0xFF);
  return output;
}

function str2rstr_utf16be(input)
{
  var output = "";
  for(var i = 0; i < input.length; i++)
    output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF,
                                   input.charCodeAt(i)        & 0xFF);
  return output;
}

/*
 * Convert a raw string to an array of big-endian words
 * Characters >255 have their high-byte silently ignored.
 */
function rstr2binb(input)
{
  var output = Array(input.length >> 2);
  for(var i = 0; i < output.length; i++)
    output[i] = 0;
  for(var i = 0; i < input.length * 8; i += 8)
    output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
  return output;
}

/*
 * Convert an array of big-endian words to a string
 */
function binb2rstr(input)
{
  var output = "";
  for(var i = 0; i < input.length * 32; i += 8)
    output += String.fromCharCode((input[i>>5] >>> (24 - i % 32)) & 0xFF);
  return output;
}

/*
 * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
 */
var sha512_k;
function binb_sha512(x, len)
{
  if(sha512_k == undefined)
  {
    //SHA512 constants
    sha512_k = new Array(
new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd),
new int64(-1245643825, -330482897), new int64(-373957723, -2121671748),
new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031),
new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736),
new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe),
new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302),
new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1),
new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428),
new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3),
new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65),
new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),
new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459),
new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210),
new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340),
new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395),
new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70),
new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),
new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473),
new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8),
new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b),
new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023),
new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30),
new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910),
new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),
new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53),
new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016),
new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893),
new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397),
new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),
new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec),
new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047),
new int64(-1090935817, -1295615723), new int64(-965641998, -479046869),
new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207),
new int64(-354779690, -840897762), new int64(-176337025, -294727304),
new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026),
new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b),
new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),
new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620),
new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430),
new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817));
  }

  //Initial hash values
  var H = new Array(
new int64(0x6a09e667, -205731576),
new int64(-1150833019, -2067093701),
new int64(0x3c6ef372, -23791573),
new int64(-1521486534, 0x5f1d36f1),
new int64(0x510e527f, -1377402159),
new int64(-1694144372, 0x2b3e6c1f),
new int64(0x1f83d9ab, -79577749),
new int64(0x5be0cd19, 0x137e2179));

  var T1 = new int64(0, 0),
    T2 = new int64(0, 0),
    a = new int64(0,0),
    b = new int64(0,0),
    c = new int64(0,0),
    d = new int64(0,0),
    e = new int64(0,0),
    f = new int64(0,0),
    g = new int64(0,0),
    h = new int64(0,0),
    //Temporary variables not specified by the document
    s0 = new int64(0, 0),
    s1 = new int64(0, 0),
    Ch = new int64(0, 0),
    Maj = new int64(0, 0),
    r1 = new int64(0, 0),
    r2 = new int64(0, 0),
    r3 = new int64(0, 0);
  var j, i;
  var W = new Array(80);
  for(i=0; i<80; i++)
    W[i] = new int64(0, 0);

  // append padding to the source string. The format is described in the FIPS.
  x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
  x[((len + 128 >> 10)<< 5) + 31] = len;

  for(i = 0; i<x.length; i+=32) //32 dwords is the block size
  {
    int64copy(a, H[0]);
    int64copy(b, H[1]);
    int64copy(c, H[2]);
    int64copy(d, H[3]);
    int64copy(e, H[4]);
    int64copy(f, H[5]);
    int64copy(g, H[6]);
    int64copy(h, H[7]);

    for(j=0; j<16; j++)
    {
        W[j].h = x[i + 2*j];
        W[j].l = x[i + 2*j + 1];
    }

    for(j=16; j<80; j++)
    {
      //sigma1
      int64rrot(r1, W[j-2], 19);
      int64revrrot(r2, W[j-2], 29);
      int64shr(r3, W[j-2], 6);
      s1.l = r1.l ^ r2.l ^ r3.l;
      s1.h = r1.h ^ r2.h ^ r3.h;
      //sigma0
      int64rrot(r1, W[j-15], 1);
      int64rrot(r2, W[j-15], 8);
      int64shr(r3, W[j-15], 7);
      s0.l = r1.l ^ r2.l ^ r3.l;
      s0.h = r1.h ^ r2.h ^ r3.h;

      int64add4(W[j], s1, W[j-7], s0, W[j-16]);
    }

    for(j = 0; j < 80; j++)
    {
      //Ch
      Ch.l = (e.l & f.l) ^ (~e.l & g.l);
      Ch.h = (e.h & f.h) ^ (~e.h & g.h);

      //Sigma1
      int64rrot(r1, e, 14);
      int64rrot(r2, e, 18);
      int64revrrot(r3, e, 9);
      s1.l = r1.l ^ r2.l ^ r3.l;
      s1.h = r1.h ^ r2.h ^ r3.h;

      //Sigma0
      int64rrot(r1, a, 28);
      int64revrrot(r2, a, 2);
      int64revrrot(r3, a, 7);
      s0.l = r1.l ^ r2.l ^ r3.l;
      s0.h = r1.h ^ r2.h ^ r3.h;

      //Maj
      Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
      Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);

      int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
      int64add(T2, s0, Maj);

      int64copy(h, g);
      int64copy(g, f);
      int64copy(f, e);
      int64add(e, d, T1);
      int64copy(d, c);
      int64copy(c, b);
      int64copy(b, a);
      int64add(a, T1, T2);
    }
    int64add(H[0], H[0], a);
    int64add(H[1], H[1], b);
    int64add(H[2], H[2], c);
    int64add(H[3], H[3], d);
    int64add(H[4], H[4], e);
    int64add(H[5], H[5], f);
    int64add(H[6], H[6], g);
    int64add(H[7], H[7], h);
  }

  //represent the hash as an array of 32-bit dwords
  var hash = new Array(16);
  for(i=0; i<8; i++)
  {
    hash[2*i] = H[i].h;
    hash[2*i + 1] = H[i].l;
  }
  return hash;
}

//A constructor for 64-bit numbers
function int64(h, l)
{
  this.h = h;
  this.l = l;
  //this.toString = int64toString;
}

//Copies src into dst, assuming both are 64-bit numbers
function int64copy(dst, src)
{
  dst.h = src.h;
  dst.l = src.l;
}

//Right-rotates a 64-bit number by shift
//Won't handle cases of shift>=32
//The function revrrot() is for that
function int64rrot(dst, x, shift)
{
    dst.l = (x.l >>> shift) | (x.h << (32-shift));
    dst.h = (x.h >>> shift) | (x.l << (32-shift));
}

//Reverses the dwords of the source and then rotates right by shift.
//This is equivalent to rotation by 32+shift
function int64revrrot(dst, x, shift)
{
    dst.l = (x.h >>> shift) | (x.l << (32-shift));
    dst.h = (x.l >>> shift) | (x.h << (32-shift));
}

//Bitwise-shifts right a 64-bit number by shift

//Won't handle shift>=32, but it's never needed in SHA512
function int64shr(dst, x, shift)
{
    dst.l = (x.l >>> shift) | (x.h << (32-shift));
    dst.h = (x.h >>> shift);
}

//Adds two 64-bit numbers
//Like the original implementation, does not rely on 32-bit operations
function int64add(dst, x, y)
{
   var w0 = (x.l & 0xffff) + (y.l & 0xffff);
   var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
   var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
   var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);
   dst.l = (w0 & 0xffff) | (w1 << 16);
   dst.h = (w2 & 0xffff) | (w3 << 16);
}

//Same, except with 4 addends. Works faster than adding them one by one.
function int64add4(dst, a, b, c, d)
{
   var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
   var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);
   var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);
   var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);
   dst.l = (w0 & 0xffff) | (w1 << 16);
   dst.h = (w2 & 0xffff) | (w3 << 16);
}

//Same, except with 5 addends
function int64add5(dst, a, b, c, d, e)
{
   var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff);
   var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16);
   var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16);
   var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);
   dst.l = (w0 & 0xffff) | (w1 << 16);
   dst.h = (w2 & 0xffff) | (w3 << 16);
}
index.php
<?php
/*
Auteur: Cas Buijs
Naam: index.php
Functie: Admin Login
Beschrijving: 	Het script encrypt het ingevoerde wachtwoord, 
				controleert de ingevoerde gegevens met de gegevens uit de database,
				geeft een foutmelding wanneer de gegevens onjuist zijn,
				encrypt een sessie voor de gebruiker wanneer de gegevens juist zijn.

*/

//Start Sessie
session_start();

//Configuratiebestanden includen
include('configuratie.php');
include('procedures/geldig_ip.php');
include('procedures/maak_functies.php');
include('talen/nl.php');

//Vooraf ingevulde sessie legen
if (isset($_SESSION['login']))
{
	unset($_SESSION['login']);
}

//Controleren of de gebruiker een geldig ip-adress gebruikt.
$ip = $_SERVER['REMOTE_ADDR'];
if (!get_valid_ip($ip)) 
{
	echo $sMelding[7];
}
else
{

	//Controleren of de sessie al bestaat
	if (!isset($_SESSION['pogingen']))
	{
		$_SESSION['pogingen'] = 0;
	}

	//Beveiliging brute-force
	if ($_SESSION['pogingen'] >= 10)
	{
		echo $sMelding[5];
	}
	else
	{

		//Controleren of iemand wil inloggen
		if (isset($_POST['login']))
		{
			

			//Controleren of er een gebruikersnaam is opgegeven
			if (!isset($_POST['gbnaam']) OR empty($_POST['gbnaam']))
			{
				echo $sMelding[1];
			}
			else
			{
				
			
				//Controleren of het wachtwoord veld wel door de javascript is geleegd
				if(!empty($_POST['gbpass']))
				{
					echo $sMelding[12];
				}
				else
				{

					//Controleren of er een geencrypt wachtwoord is meegestuurd
					if (!isset($_POST['hash']) OR empty($_POST['hash']))
					{
						echo $sMelding[2];
					}
					else
					{
				
						//Controleren of er een challenge is meegestuurd
						if (!isset($_POST['challenge']) OR empty($_POST['challenge']))
						{
							echo $sMelding[11];
						}
						else
						{
				
							//Controleren of er een response is meegestuurd
							if (!isset($_POST['response']) OR empty($_POST['response'])) //Anti Manipulatie
							{
								echo $sMelding[11];
							}
							else
							{

								//Controleren op illegale tekens in de gebruikersnaam
								if(!preg_match('/^[a-zA-Z0-9]+$/',$_POST['gbnaam'])) //Anti Manipulatie
								{
									echo $sMelding[3];
								}
								else
								{

									//Controleren op illegale tekens door manipulatie in het hash veld
									if(!preg_match('/^[a-zA-Z0-9]+$/',$_POST['hash'])) //Anti Manipulatie
									{
										echo $sMelding[3];
									}
									else
									{
						
										//Controleren of de gegevens de vereiste lengte hebben
										if (strlen($_POST['gbnaam']) >= 15)
										{
											echo $sMelding[9];
										}
										else
										{
							
											//Controleren of de waarde wel een sha512 hash waarde is
											if (strlen($_POST['hash']) != 128)
											{
												echo $sMelding[11];
											}
											else
											{
								
												//Controleren of de waarde wel een sha512 hash waarde is
												if (strlen($_POST['response']) != 128)
												{
													echo $sMelding[11];
												}
												else
												{

													//Controleren of de challenge waarde overeen komt
													if ($_SESSION['challenge'] != $_POST['challenge'])
													{
														echo $sMelding[11];
													}
													else
													{
									
														//Controleren of de response juist is
														$deelteken = ':';
														$responsecontrol = $_POST['hash'].$deelteken.$_SESSION['challenge'];
														if (hash("sha512", $responsecontrol) != $_POST['response'])
														{
															echo $sMelding[11];
														}
														else
														{
														
															//Wachtwoord Encryptie
															$wachtwoord = maak_wachtwoord($_POST['hash']);
															
															//Verbinding maken met de database
															$qGegeven = "SELECT naam,wachtwoord FROM login WHERE naam='".mysql_real_escape_string($_POST['gbnaam'])."' LIMIT 0,1";
															$qGegevenquery = mysql_query($qGegeven);

															//Controleren op fouten in de verbinding
															if ($qGegevenquery === false)
															{
																echo $sMelding[4];
															}
															else
															{

																//Gegevens beschikbaar stellen
																$gegevens = mysql_fetch_array($qGegevenquery);
	
																//Wachtwoord verifieren
																$verify = controleer_wachtwoord($_POST['hash'], $gegevens['wachtwoord']);

																//Controleren of het ingevulde wachtwoord, ook het echte wachtwoord is
																if ($verify == 1)
																{

																	echo $sMelding[6]; //Bevestigings bericht als de inlog gelukt is.
																	header('Refresh: 2; url=home/index.php'); //Na 2 seconden wordt de gebruiker naar de volgende pagina doorgestuurd

																	//Sessie encryptie wordt gemaakt
																	$sessie = maak_sessie($_POST['gbnaam']);

																	//Sessie maken om de gebruiker later te kunnen herkennen
																	$_SESSION['login'] = $sessie;
																	$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];

																	//Sessie in de database bijhouden
																	$qSessie = "UPDATE login SET sessie='".mysql_real_escape_string($sessie)."', ip='".mysql_real_escape_string($_SERVER['REMOTE_ADDR'])."', useragent='".mysql_real_escape_string($_SERVER['HTTP_USER_AGENT'])."' WHERE naam='".mysql_real_escape_string($_POST['gbnaam'])."'";
																	$qSessiequery = mysql_query($qSessie);

																	//Controleren of de sessie naar de database is geschreven
																	if ($qSessiequery === false)
																	{
																		echo $sMelding[4];
																	}
																	else
																	{

																		//Foutieve inlog pogingen herstellen
																		$_SESSION['pogingen'] = 0;

																		sleep(1); //Anti Brute-Force
																	}
																}
																else
																{
																	echo $sMelding[3]; //Melding van foute login
	
																	//Aantal pogingen verhogen
																	$_SESSION['pogingen'] = $_SESSION['pogingen'] + 1;
																		
																	sleep(1); //Anti Brute-force
																		
																}//Foutieve login
															}//Foute sql query bij controle of de gebruiker bestaat	
														}//Einde response controle
													}//Einde challenge controle
												}//Response lengte controle
											}//Hash lengte controle
										}//Gebruikersnaam lengte controle
									}//Hash Pregmatch
								}//Gebruikersnaam Pregmatch
							}//Response ingevuld of niet
						}//Challenge ingevuld of niet
					}//Hash ingevuld of niet
				}//Wachtwoord veld geleegd of niet
			}//Gebruikersnaam ingevuld of niet
		}//Einde login script
	}//Einde Brute-Force beveiliging
}//Einde Geldig-IP controle
	
	
//Nieuwe challenge sessie maken
$_SESSION['challenge'] = maak_challenge();

?>
<script type="text/javascript" src="modules/encryption.js"></script>
<script type="text/javascript">
<!--
	function antiPostBack()
	{
		document.getElementById( 'hash' ).value = hex_sha512( document.getElementById( 'gbpass' ).value );
		document.getElementById( 'response' ).value = hex_sha512( hex_sha512( document.getElementById( 'gbpass' ).value ) + ":" + document.getElementById( 'challenge' ).value);
		document.getElementById( 'gbpass' ).value = '';
		return true;
	}
//-->
</script>
<!DOCTYPE html>
<html>
	<head>
		<title>Login</title>
		<link rel="icon" type="image/png" href="favicon.png" />
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<link href="style/login.css" rel="stylesheet" type="text/css" />
	</head>
	<body>
		<h1>Login</h1>
		<form method="post" onsubmit="return antiPostBack();">
			<table id="table">
				<tr>
					<td>Gebruikersnaam: </td>
					<td><input type="text" name="gbnaam"></td>
				</tr>
				<tr>
					<td>Wachtwoord: </td>
					<td><input type="password" id="gbpass"></td>
				</tr>
				<tr>
					<td></td>
					<td><input type="submit" name="login" value="Login"></td>
				</tr>
				<tr>
					<td></td>
					<td><input type="hidden" name="challenge" id="challenge" value="<?php echo $_SESSION['challenge'];?>"></td>
				</tr>
				<tr>
					<td></td>
					<td><input type="hidden" name="hash" id="hash" value=""></td>
				</tr>
				<tr>
					<td></td>
					<td><input type="hidden" name="response" id="response" value=""></td>
				</tr>
			</table>
		</form>
	</body>
</html>
Bcrypt.php
<?php
class Bcrypt {
  private $rounds;
  public function __construct($rounds = 12) {
    if(CRYPT_BLOWFISH != 1) {
      throw new Exception("bcrypt not supported in this installation. See http://php.net/crypt");
    }

    $this->rounds = $rounds;
  }

  public function hash($input) {
    $hash = crypt($input, $this->getSalt());

    if(strlen($hash) > 13)
      return $hash;

    return false;
  }

  public function verify($input, $existingHash) {
    $hash = crypt($input, $existingHash);

    return $hash === $existingHash;
  }

  private function getSalt() {
    $salt = sprintf('$2a$%02d$', $this->rounds);

    $bytes = $this->getRandomBytes(16);

    $salt .= $this->encodeBytes($bytes);

    return $salt;
  }

  private $randomState;
  private function getRandomBytes($count) {
    $bytes = '';

    if(function_exists('openssl_random_pseudo_bytes') &&
        (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN')) { // OpenSSL slow on Win
      $bytes = openssl_random_pseudo_bytes($count);
    }

    if($bytes === '' && is_readable('/dev/urandom') &&
       ($hRand = @fopen('/dev/urandom', 'rb')) !== FALSE) {
      $bytes = fread($hRand, $count);
      fclose($hRand);
    }

    if(strlen($bytes) < $count) {
      $bytes = '';

      if($this->randomState === null) {
        $this->randomState = microtime();
        if(function_exists('getmypid')) {
          $this->randomState .= getmypid();
        }
      }

      for($i = 0; $i < $count; $i += 16) {
        $this->randomState = md5(microtime() . $this->randomState);

        if (PHP_VERSION >= '5') {
          $bytes .= md5($this->randomState, true);
        } else {
          $bytes .= pack('H*', md5($this->randomState));
        }
      }

      $bytes = substr($bytes, 0, $count);
    }

    return $bytes;
  }

  private function encodeBytes($input) {
    // The following is code from the PHP Password Hashing Framework
    $itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';

    $output = '';
    $i = 0;
    do {
      $c1 = ord($input[$i++]);
      $output .= $itoa64[$c1 >> 2];
      $c1 = ($c1 & 0x03) << 4;
      if ($i >= 16) {
        $output .= $itoa64[$c1];
        break;
      }

      $c2 = ord($input[$i++]);
      $c1 |= $c2 >> 4;
      $output .= $itoa64[$c1];
      $c1 = ($c2 & 0x0f) << 2;

      $c2 = ord($input[$i++]);
      $c1 |= $c2 >> 6;
      $output .= $itoa64[$c1];
      $output .= $itoa64[$c2 & 0x3f];
    } while (1);

    return $output;
  }
}
?>
index.php
maak_functies.php
<?php
//Class Bcrypt includen voor gebruik
include('bcrypt.php');

//Functie voor definitie van bcrypt
function bcrypt()
{
  static $bcrypt;

  if (empty($bcrypt))
  {
    $bcrypt = new Bcrypt(15);
  }

  return $bcrypt;
}

//Functie om het wachtwoord te maken
function maak_wachtwoord($wachtwoord)
{
	//Maken van de hash voor het wachtwoord
	$hmac = hash_hmac('sha512', $wachtwoord, 'thisisaveryverysecretkeyyouknow');
	$hash = bcrypt()->hash($hmac);

  return $hash;
}

//Functie om het gemaakte wachtwoord te controleren
function controleer_wachtwoord($wachtwoord, $hash)
{
  $hmac = hash_hmac('sha512', $wachtwoord, 'thisisaveryverysecretkeyyouknow');

  return bcrypt()->verify($hmac, $hash);
}

function maak_sessie($sessie) 
{
$sessie = crypt($_POST['gbnaam'], $_SERVER['REMOTE_ADDR']); //Sessie wordt hier gemaakt.
$sessie = crypt($sessie, microtime()); //Sessie wordt hier voor de eerste keer gecodeerd.
$sessie = crypt($sessie, $_SERVER['REQUEST_TIME']); //Sessie wordt hier voor de tweede keer gecodeerd.
$sessie = $sessie.rand(0,25).rand(0,999).rand(0,9999999);
$sessie = hash("sha512", $sessie);

return $sessie;
}

function maak_challenge()
{
$iGetal = rand(0,999999);
$iDeel = rand(11,51);
$iDelen = $iGetal / $iDeel;
$fFloor = floor($iDelen);
$aLetters = range('a', 'z');
$aHletters = range('A', 'Z');
$aCijfers = range('0', '9');
$iRek = $fFloor + rand(0, 9999999).$aCijfers[rand(0, 9)].$aCijfers[rand(0, 9)].$aCijfers[rand(0, 9)].$aCijfers[rand(0, 9)];
$sEnc = $iRek.$aLetters[rand(0, 25)].$aHletters[rand(0, 25)].$aLetters[rand(0, 25)].$aCijfers[rand(0, 9)].$iRek.$aLetters[rand(0, 25)].$aCijfers[rand(0, 9)].$aCijfers[rand(0, 9)].$aHletters[rand(0, 25)].$aCijfers[rand(0, 9)].$aLetters[rand(0, 25)];
return $sEnc;
}
?>
login.css
h1 {
	text-align: center; 
}

#table {
	text-align: center;
	margin-left: auto;
	margin-right: auto;
	border-spacing: 2px;
	padding: 2px;
}
geldig_ip.php
<?php
/*
Naam: geldig_ip.php
Functie: Controleren van ip op geldigheid
Beschrijving:	Hier wordt het ip dat wordt meegegeven bij de aanroep van deze functie
				gecontroleerd op geldigheid.
*/
function get_valid_ip($ip) 
{
    return preg_match("/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])" .
            "(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/", $ip );
}
?>
index.php
index.php
nl.php
<?php
//Lijst met meldingen
$sMelding = array();
$sMelding[1] = 'Vul een gebruikersnaam in!';
$sMelding[2] = 'Vul een wachtwoord in!';
$sMelding[3] = 'Verkeerde inloggegevens';
$sMelding[4] = 'Er kon geen verbinding met de database worden gemaakt!';
$sMelding[5] = 'Sorry, maar je hebt vandaag al 10 foutieve login pogingen gehad, je bent nu geblokkeerd!';
$sMelding[6] = 'U bent succesvol ingelogd!';
$sMelding[7] = 'U bent geen geldig persoon!';
$sMelding[8] = 'U bezoekt een ongeldige site';
$sMelding[9] = 'De gebruikersnaam bevat te veel karakters!';
$sMelding[10] = 'Het wachtwoord bevat te veel karakters!';
$sMelding[11] = 'Er ging iets mis met het inloggen, probeer het later nog een keer.';
$sMelding[12] = 'U kunt niet inloggen, door een fout is er een veiligheids probleem ontstaan, licht onmiddelijk de webmaster in!';

//Lijst met meldingen bij niet ingelogde gebruikers
$sIngelogd = array();
$sIngelogd[1] = 'Je bent niet ingelogd!';


//Lijst met meldingen van errors
$sError = array();
$sError[1] = 'Er ging iets mis, probeer het later nog een keer!';
?>
configuratie.php
<?php
/*
Auteur: Cas Buijs
Naam: configuratie.php
Functie: verbinding met database maken
Beschrijving:	Hier vul je de gegevens van je database in, dit script zorgt ervoor dat er een verbinding
				met de database ontstaat, die al jou pagina's waar dit bestand is geincluded, kunnen gebruiken.
*/
$host = "";
$naam = "";
$wachtwoord = "";
$database = "";

mysql_connect($host, $naam, $wachtwoord) or die("Er kon geen verbinding worden gemaakt met de database!");
mysql_select_db($database) or die("Er kon geen verbinding worden gemaakt met de database!!");

?>
controle.php
<?php
//Sessie controle starten
session_start();

//Configuratiepad includen
include('configuratie.php');
include('procedures/geldig_ip.php');
include('talen/nl.php');

//Controleren of er een sessie is gemaakt voor de gebruiker
if (!isset($_SESSION['login']) OR $_SESSION['login'] == '')
{
	echo $sIngelogd[1];
	exit;
}

//Controleren of de gebruiker een geldig ip-adress gebruikt.
if (!get_valid_ip($_SERVER['REMOTE_ADDR'])) 
{
	echo $sError[1];
	exit;
}

//Controleren of er een user-agent bestaat
if (!isset($_SERVER['HTTP_USER_AGENT']))
{
	echo $sIngelogd[1];
	exit;
}

//Gegevens ophalen uit de database
$qSessie = "SELECT naam,sessie,useragent FROM login WHERE sessie='".mysql_real_escape_string($_SESSION['login'])."' AND ip='".mysql_real_escape_string($_SERVER['REMOTE_ADDR'])."' LIMIT 0,1";
$qSessies = mysql_query($qSessie);

//Controleren of de naam goed is opgehaald uit de database
if($qSessies === false)
{
	echo $sError[1];
	exit;
}

//Opgehaalde gegevens als integer inzetten
$iControle = mysql_num_rows($qSessies);

//Controleren of de gebruiker is ingelogd
if ($iControle != 1)
{
	echo $sIngelogd[1];
	exit;
}

//Controleren of de user-agent klopt
if ($sGegevens['useragent'] != $_SERVER['HTTP_USER_AGENT'])
{
	echo $sIngelogd[1];
	exit;
}


?>
index2.php
<?php
/*
Auteur: Cas Buijs
Naam: index2.php
Functie: Admin Index
Beschrijving: 	De frame indeling van de site.

*/

//Veiligheids controle
include('controle.php');

/*
De rest van de pagina kun je gebruiken om je eigen informatie neer te zetten.
De include controleert of de persoon is ingelogt of niet.
*/

?>

uitloggen.php
<?php
/*
Auteur: Cas Buijs
Naam: uitloggen.php
Beschrijving: Wanneer de gebruiker op de uitlog knopt klikt wordt zijn sessie geupdate
			  Naar een onmogelijke sessie zodat de gebruiker wordt uitgelogd.
	
*/

//Veiligheidscontrole uitvoeren
include('controle.php');
include('talen/nl.php');

//Controleren of de gebruiker wil uitloggen
if(isset($_POST['uitloggen']))
{

	//Sessie update in de database
	$qLog = "UPDATE login SET sessie='', ip='', useragent='' WHERE sessie='".mysql_real_escape_string($_SESSION['login'])."' AND ip='".mysql_real_escape_string($_SERVER['REMOTE_ADDR'])."'";
	$qLogs = mysql_query($qLog);

	//Controleren of de naam goed is opgehaald uit de database
	if($qLogs === false)
	{
		echo $sError[1];
	}
	else
	{

		//Sessie legen
		if (isset($_SESSION['login']))
		{
			unset($_SESSION['login']);
		}
		session_destroy();
		
		//Redirect naar de inlog pagina
		header('Refresh: 0; url=../index.php');
	}
}?>
<html>
	<center>
		<form method="post">
			<input type="submit" name="uitloggen" value="Uitloggen">
		</form>
	</center>
</html>
database.sql


CREATE TABLE IF NOT EXISTS `login` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `naam` varchar(255) NOT NULL,
  `wachtwoord` varchar(255) NOT NULL,
  `sessie` varchar(255) NOT NULL,
  `useragent` varchar(255) NOT NULL,
  `ip` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;



Reacties

0
Nog geen reacties.