PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ref per Gutscheincode



mine321
08.07.2013, 12:59
Hallo,

ich wollte mal fragen ob es sowas schon gibt? Und wenn nicht wer Zeit und Lust hätte und dies erstellen könnte. Preis dann nach Absprache und in Klammlose.

NeoGriever
08.07.2013, 15:12
Die Idee hatte ich schon länger. Kann dir gerne was entsprechendes programmieren.

mine321
08.07.2013, 18:18
Neo, danke für das Angebot. Ich meld mich dann per ICQ bei dir wegen alles weiteren.

NeoGriever
08.07.2013, 19:07
Bin schon dabei, das ganze zu programmieren. Bin fast fertig.

################################################## ################

ÄNDERUNG:
Um einen kleinen Fehler zu beheben, folgende Änderung vornehmen:
In der Datei: /content/konto/refgutschein.php
Zeile: 18
Original-Code-Zeile:
$sqlr = 'SELECT * FROM `' . $db_prefix . '_refkeys` WHERE `id` = ' . $data . ' LIMIT 1';
Korrigierte Code-Zeile:
$sqlr = 'SELECT * FROM `' . $db_prefix . '_refkeys` WHERE `id` = ' . @(int)$data . ' AND `user` = ' . $_SESSION["uid"] . ' LIMIT 1';

################################################## ################

Das Script ist fertig!

Features:
- Unbegrenzte Anzahl an Gutscheinen von jedem User beliebig generierbar.
- "Permanent"-Gutscheine
- - Lassen sich mehrmals verwenden
- - Funktionieren NICHT, wenn das Guthaben des Erstellers nicht ausreichen. (Mehr dazu in folgenden Punkten)
- Beliebig festlegbarer "Anmeldebonus", welcher vom Gutschein-Ersteller-Konto abgebucht und auf das Konto des neuen Benutzers aufgebucht wird, insofern der Ersteller genug Guthaben besitzt. Einweg-Gutscheine buchen den Betrag vorher ab.
- Beliebig festlegbarer Code. Wird dies nicht festgelegt, wird ein zufälliger Code generiert.
- Gutscheine lassen sich löschen. Einweg-Gutscheine buchen, insofern nicht benutzt, den einbehaltenen Betrag zurück.

Ist sehr ausführlich umgesetzt und dürfte gegen alles und jeden gesichert sein. Minusbuchungen, Bugs und Hacks dürften keine Chance haben.

Hier das Snippet:

Datenbank-Tabelle erzeugen:

CREATE TABLE IF NOT EXISTS `vms_refkeys` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`key` varchar(19) NOT NULL,
`user` int(11) NOT NULL,
`bonus` bigint(20) NOT NULL DEFAULT '0',
`ref` int(11) NOT NULL DEFAULT '0',
`permanent` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
Nicht vergessen, das prefix anzupassen!

Datei erstellen
Dateiname: /content/konto/refgutschein.php
Code:
<?php
userstatus();
function generate_hash($seed) {
$key = md5(str_rot13(md5($seed)));
$hash = substr($key,0,3) . "-";
$hash.= substr($key,4,3) . "-";
$hash.= substr($key,22,3) . "-";
$hash.= substr($key,6,3) . "-";
$hash.= substr($key,9,3);
return(strtoupper($hash));
}

if(isset($_POST["delete"])) {
$gg = 0;
$sql = 'DELETE FROM `' . $db_prefix . '_refkeys` WHERE ';
foreach($_POST["delete"] as $data) {
$sqlr = 'SELECT * FROM `' . $db_prefix . '_refkeys` WHERE `id` = ' . @(int)$data . ' AND `user` = ' . $_SESSION["uid"] . ' LIMIT 1';
$erg = db_query($sqlr);
if(mysql_num_rows($erg) > 0) {
$gs = mysql_fetch_object($erg);
if($gs->permanent == 0 AND $gs->bonus > 0 AND $gs->ref == 0) {
$buchungs_id = create_code(14);
db_query('UPDATE `' . $db_prefix . '_kontodaten` SET `kontostand` = `kontostand` + ' . $gs->bonus . ' WHERE `uid` = ' . $_SESSION['uid'] . ' LIMIT 1');
buchungsliste($buchungs_id,$gs->bonus,"Ref-Gutschein gelöscht",$_SESSION['uid']);
}
if($gg == 0) {
$gg = 1;
}else{
$sql .= ' OR ';
}
$sql .= '`id` = ' . $data;
}
}
db_query($sql);
head("Info");
?>
Die ausgewählten Ref-Gutscheine wurden gelöscht.<br>
Eventuell erhaltene Refs werden davon nicht beeinflusst.<br>
<br>
<a href="?content=/konto/refgutschein">Zurück</a>
<?php
foot();
}elseif(isset($_POST["bonus"]) AND isset($_POST["custom_code"])) {
$permanent = 0;
$code = "";
if(isset($_POST["permanent"])) {
$permanent = 1;
}
if(strlen($_POST["custom_code"])) {
$code = $_POST["custom_code"];
if(preg_match("/[a-zA-Z0-9_-]*/",$code) !== 1 OR @(int)mysql_num_rows(@db_query('SELECT * FROM `' . $db_prefix . '_refkeys` WHERE `key` = \'' . mysql_real_escape_string($code) . '\' LIMIT 1')) > 0) {
$code = generate_hash(microtime() . time());
}
}else{
$code = generate_hash(microtime() . time());
}
$bonus = intval($_POST["bonus"]);
if($bonus == "NaN") {
$bonus = 0;
}
if($bonus < 0) {
$bonus = 0;
}
$can = true;
if($bonus > 0) {
$sql = 'SELECT * FROM `' . $db_prefix . '_kontodaten` WHERE `uid` = ' . $_SESSION["uid"] . ' LIMIT 1';
$erg = db_query($sql);
$usr = mysql_fetch_object($erg);
if($usr->kontostand >= $bonus) {
$buchungs_id = create_code(14);
db_query('UPDATE `' . $db_prefix . '_kontodaten` SET `kontostand` = `kontostand` - ' . $bonus . ' WHERE `uid` = ' . $_SESSION['uid'] . ' LIMIT 1');
buchungsliste($buchungs_id,0 - $bonus,"Gutscheinerstellung",$_SESSION['uid']);
$can = true;
}else{
$can = false;
}
}
if($can == true) {
$sql = 'INSERT INTO `' . $db_prefix . '_refkeys` (`id`, `key`, `user`, `bonus`, `ref`, `permanent`) VALUES (NULL, \'' . mysql_real_escape_string($code) . '\', ' . $_SESSION["uid"] . ', ' . $bonus . ', 0, ' . $permanent . ')';
$res = db_query($sql);
head("Info");
?>Es wurde ein neuer Ref-Gutschein erzeugt. Sollte ein eigener Gutschein-Code angegeben worden sein, welcher entweder schon verwendet wurde oder ungültig ist, wurde dieser mit einem zufälligem Code ersetzt.<br>
<br>
<a href="?content=/konto/refgutschein">Zurück</a><?php
foot();
}else{
head("Fehler");
?>Dein Guthaben reicht nicht aus, um diesen Gutschein zu erstellen.<br>
<br>
<a href="?content=/konto/refgutschein">Zurück</a><?php
foot();
}
}else{


head("Deine Ref-Gutscheine");

$sql = 'SELECT * FROM `' . $db_prefix . '_refkeys` WHERE `user` = ' . @(int)$_SESSION["uid"] . ' ORDER BY `id` DESC';
$erg = db_query($sql);
if(mysql_num_rows($erg) > 0) {
?>
<form action="?content=/konto/refgutschein" method="post">
<?php
while($eintrag = mysql_fetch_object($erg)) {
?>
<div style="margin:3px;border:1px solid gray;padding:4px;"><input id="k<?php echo $eintrag->id;?>" type="checkbox" name="delete[]" value="<?php echo $eintrag->id;?>"></input>
<label for="k<?php echo $eintrag->id;?>">
Code:
</label>
<input onClick="this.select(0,19)" style="width:128px;text-align:center;background:transparent;color:black;bo rder:0px;font-family:Courier new;font-size:10px;border-bottom:1px solid gray;" type="text" readonly value="<?php echo $eintrag->key;?>"></input><br>
<label for="k<?php echo $eintrag->id;?>" style="display:block;margin-left:24px;">
Losegutschrift: <?php echo number_format($eintrag->bonus,2,",",".");?> Klammlose<br>
Permanent: <?php
if($eintrag->permanent == 1) {
echo "Ja";
?> - Verwendet: <b><?php echo number_format($eintrag->ref,0,",",".");?></b> mal<?php

}else{
echo "Nein";
?> - Verbraucht: <b><?php
if($eintrag->ref == 0) {
?><span style="color:green;">Nein</span><?php
}else{
$ref = mysql_fetch_object(db_query('SELECT * FROM `' . $db_prefix . '_userdaten` WHERE `uid` = ' . $eintrag->ref . ' LIMIT 1'));
?><a href="?content=/nickpage&nick=<?php echo urlencode($ref->nickname);?>"><span style="color:red;"><?php echo $ref->nickname;?> (<?php echo $ref->uid;?>)</span></a><?php
}
?></b><?php
}
?>
</label>
</div>
<?php
}
?>
<br>
<div style="text-align:right;" align="right">
<input type="submit" value="Ausgewählte Einträge löschen"></input><br>
</div>
Das Löschen der ausgewählten Einträge hat keinen Effekt auf bereits durch die Gutscheine erhaltenen Ref's.<br>
<b>Es erfolgt keine weitere Abfrage!</b>
</form>
<?php
}else{
?><center>
Du besitzt noch keine Ref-Gutscheine.<br>
Im unteren Formular kannst du dir einen
Ref-Gutschein erzeugen lassen.
</center><?php
}

foot();

head("Ref-Gutschein erzeugen");
?>
<form action="?content=/konto/refgutschein" method="POST">
Hier kannst du dir einen Ref-Gutschein erzeugen lassen. Dieser kann von neuen
Mitgliedern angegeben werden, um einen Bonus bei der Neuanmeldung zu erhalten.
Gibt ein neues Mitglied einen deiner Gutscheine bei der Registrierung an, wird
dieser automatisch als dein Ref eingetragen.<br>
<br>
<b>Losegutschrift:</b><br>
<input style="text-align:right;font-family:Courier New;background:white;color:black;font-size:12px;border:0px;border-bottom:1px solid gray;" pattern="[0-9]*" type="number" value="0" name="bonus"></input> <label for="bonus">Klammlose</label><br>
Hier kannst du einen frei wählbaren, positiven Betrag angeben, welcher einem
neuem Mitglied, welcher deinen Gutscheincode angibt, als Anmeldebonus
gutgeschrieben wird. Der Betrag wird, insofern genügend Guthaben vorhanden ist,
direkt von deinem Konto abgebucht und "aufgespart". Beim Löschen des unbenutzten
Gutscheines wird der Betrag wieder zurückgebucht. Sollte dein Guthaben nicht
ausreichen, wird kein Gutschein erzeugt. Ein Permanent-Gutschein bucht erst dann
von deinem Konto die Gutschrift ab, wenn sich ein neues Mitglied mittels des Gutscheins
hier anmeldet.<br>
<br>
<b>Persöhnlicher Code:</b><br>
<input style="text-align:right;font-family:Courier New;background:white;color:black;font-size:12px;border:0px;border-bottom:1px solid gray;" pattern="[a-zA-Z0-9_-]*" type="text" value="" name="custom_code" maxlength="19"></input><br>
Du kannst hier einen beliebigen, maximal 19 Zeichen langen Text eingeben,
welcher als Gutscheincode verteilt werden kann. Gibst du keinen Code an,
wird ein zufälliger, 19-Zeichen langer Code generiert. Wird der Code bereits
verwendet oder ist ungültig, wird automatisch ein zufälliger Code generiert.<br>
Erlaubte Zeichen: Buchstaben (A bis Z, a bis z), Zahlen (0 bis 9), Unterstrich (_) und Bindestrich (-)<br>
<br>
<input type="checkbox" name="permanent" id="dauergutschein"></input> <label for="dauergutschein">Dauergutschein</label><br>
Soll der Gutschein permanent gültig sein? D. H., dass der Gutschein nach
einmaliger Verwendung nicht verfällt und von anderen Usern weiterhin nutzbar
ist.<br>
Die Wirkung des Gutscheins hält jedoch nur solange an, wie auch genug Lose
auf ihrem Konto für die Losegutschrift vorhanden sind. Sobald die
Losegutschrift nicht ausgeglichen werden kann, verfällt der Effekt des
Gutscheines und der User kann diesen nicht mehr einlösen.<br>
<br>
<input type="submit" value="Ref-Gutschein-Code erzeugen."></input>
</form>
<?
foot();
}
head("Copyright")
?>
<div style="text-align:center;" align="center">
Copyright by <a href="http://www.klamm.de/user/JuliusCaesarIV">JuliusCaesarIV (348575)</a>
</div>
<?php
foot();
?>

Datei bearbeiten:
Dateiname: /content/intern/anmelden.php
Nach
if ($_POST['newsletter'] == 1 and $_POST['paidmails'] == 1) $mailstatus = 3;
Folgenden Code einfügen:
$startkapital = 0;
if(!empty($_POST["refkey"])) {
$key = $_POST["refkey"];
$sql = 'SELECT * FROM `' . $db_prefix . '_refkeys` WHERE `key` = \'' . mysql_real_escape_string($key) . '\' LIMIT 1';
$erg = db_query($sql);
if(mysql_num_rows($erg) > 0) {
$gs = mysql_fetch_object($erg);
if($gs->permanent == 1) {
$sql = 'SELECT * FROM `' . $db_prefix . '_kontodaten` WHERE `uid` = ' . $gs->user . ' LIMIT 1';
$erg = db_query($sql);
$usr = mysql_fetch_object($erg);
if($usr->kontostand >= $gs->bonus) {
$buchungs_id = create_code(14);
db_query('UPDATE `' . $db_prefix . '_kontodaten` SET `kontostand` = `kontostand` - ' . $gs->bonus . ' WHERE `uid` = ' . $_SESSION['uid'] . ' LIMIT 1');
buchungsliste($buchungs_id,0 - $gs->bonus,"Neuanmeldung über Gutschein",$gs->user);
$startkapital = $gs->bonus;
$_SESSION['werber'] = $gs->user;
$sql = 'UPDATE `' . $db_prefix . '_refkeys` SET `ref` = `ref` + 1 WHERE `id` = ' . $gs->id . ' LIMIT 1';
db_query($sql);
}else{
head("Fehler");
?>Der angegebene Gutschein ist leider ungültig.<br><br><a href="?content=/intern/anmelden">Zurück</a><?php
foot();
exit;
}
}else{
if($gs->ref == 0) {
$startkapital = $gs->bonus;
$_SESSION['werber'] = $gs->user;
$sql = 'UPDATE `' . $db_prefix . '_refkeys` SET `ref` = ' . $_POST["uid"] . ' WHERE `id` = ' . $gs->id . ' LIMIT 1';
db_query($sql);
}else{
head("Fehler");
?>Der angegebene Gutschein ist leider ungültig.<br><br><a href="?content=/intern/anmelden">Zurück</a><?php
foot();
exit;
}
}
}else{
head("Fehler");
?>Der angegebene Gutschein ist leider ungültig.<br><br><a href="?content=/intern/anmelden">Zurück</a><?php
foot();
exit;
}
}


In der selben Datei die Zeile
db_query("INSERT INTO ".$db_prefix."_kontodaten (uid,passwort,status,hinweis,kontostand) VALUES ('".$_POST['uid']."','".md5($_POST['passwort_1'])."','1','','0')"); mit Folgender ersetzen:
db_query("INSERT INTO ".$db_prefix."_kontodaten (uid,passwort,status,hinweis,kontostand) VALUES ('".$_POST['uid']."','".md5($_POST['passwort_1'])."','1','','" . $startkapital . "')");

In der selben Datei nach
<tr>
<td class="main"><b>Passwortbestätigung:</b></td>
<td class="main"><input type="password" name="passwort_2"></td>
</tr>folgenden Code einfügen:
<tr>
<td class="main"><b>Gutschein:</b></td>
<td class="main"><input type="text" name="refkey"></td>
</tr>

Und zu guter Letzt irgendwo im Menü eine Verlinkung auf "?content=/konto/refgutschein" erstellen. Fertig.

NeoGriever
08.07.2013, 20:08
Ich habs mal nacheditiert. Diese Antwort dient lediglich dem "Push" im Forum :)

jpwfour
09.07.2013, 12:40
...
Ist sehr ausführlich umgesetzt und dürfte gegen alles und jeden gesichert sein. Minusbuchungen, Bugs und Hacks dürften keine Chance haben.
...


:eek: Na wenigstens benutzt du den Konjunktiv, aber spar dir solche Aussagen besser gleich ganz :)

In der Datei /content/konto/refgutschein.php



if(isset($_POST["delete"])) {
$gg = 0;
$sql = 'DELETE FROM `' . $db_prefix . '_refkeys` WHERE ';
foreach($_POST["delete"] as $data) {
$sqlr = 'SELECT * FROM `' . $db_prefix . '_refkeys` WHERE `id` = ' . $data . ' LIMIT 1';
$erg = db_query($sqlr);
if(mysql_num_rows($erg) > 0) {
$gs = mysql_fetch_object($erg);
if($gs->permanent == 0 AND $gs->bonus > 0 AND $gs->ref == 0) {
$buchungs_id = create_code(14);
db_query('UPDATE `' . $db_prefix . '_kontodaten` SET `kontostand` = `kontostand` + ' . $gs->bonus . ' WHERE `uid` = ' . $_SESSION['uid'] . ' LIMIT 1');
buchungsliste($buchungs_id,$gs->bonus,"Ref-Gutschein gelöscht",$_SESSION['uid']);
//....

Wird nicht grpüft, ob die via POST übergebenen Gutschein IDs auch tatsächlich dem aktuell eingeloggten User zugeordnet sind. Da diese nicht schwer zu erraten sind (Auto_increment), und sofern vorhanden und noch nicht eingelöst dem aktuell eingeloggten User gutgeschrieben werden beim Löschen, naja das solltest du jetzt selber erraten können ...

Achso, $_POST["delete"] wird auch nicht geprüft auf SQL Injection, weiter hab ichs mir nicht angeschaut.

Und so einer traut sich dann zu, ein VMS Reloaded....., ach egal ^^

NeoGriever
09.07.2013, 16:29
Uhhh. Ein böser Kritiker.

Die Prüfung, ob dem User die Gutscheine auch gehören ist ruckzuck eingebaut. Und Fehler macht jeder mal. Also halt mal schön die Backen.

Es wird sofort geändert und hier in der Anleitung korrigiert.

Und darüber hinaus: Das VMSR wird seit WOCHEN von mir bearbeitet. Ich schau an jeder Ecke. Ich habe 6 Tester "anwerben" dürfen, die das VMSR auf Herz und Nieren testen und solche Fehler, die du hier kritisierst, aufspüren zu versuchen.
DIESES kurze Script habe ich alleine umgesetzt und auch alleine getestet. Deine Kritik, dass ich EINE sache vergessen habe, fruchtet mal überhaupt nicht im Bezug aufs VMSR. Gehirn einschalten, Freundchen.

Nobody is Perfect. Und wer nen Fehler findet, kann diesen Fehler gerne melden. Aber nich dazu verwenden, kritik an anderen Projekten auszuüben, was damit nichts zu tun hat.

Darüber hinaus: Versuch du mal aus den Fingern ein Script zu saugen, was bis jetzt nur diesen gravierenden fehler drin hat.

Wenn du nochmal sowas vom Stapel lässt, werd ich anfangen, an deinen Projekten so agressiv destruktiv rumzukritisieren.

Masterphil
09.07.2013, 23:00
@ Neogriever: Du solltest auch dein "Gehirn anschalten, Freundchen" ... Wenn hier ein alter Hase im Bezug auf Sicherheit besogt ist, solltest du dir dies zu Herzen nehmen und nicht sowas hier vom Stapel lassen. Mehr brauch ich dazu nicht sagen, war schon fast zu viel sich einzumischen.

MfG

NeoGriever
10.07.2013, 04:34
Er hätte es mir auch etwas anders mitteilen können als es gleich so hinzustellen, als hätte ich nix drauf. Ich habe das Script halt in kurzer Zeit umgesetzt und wie schon mehrfach gesagt: Nobody is perfect. Kritik schön und gut. Aber dann noch an was anderem rummeckern, was hiermit nix zu tun hat und wo ich schon wesentlich länger dran arbeite, ist wohl etwas zu viel der übertreibung gewesen.

jpwfour
10.07.2013, 13:17
Allein die Reaktion sagt schon so viel aus ^^

Aber egal, am Ende müssen die Webbis das selber entscheiden, ob sie ein von dir "überarbeitetes" Skript einsetzen wollen oder eben nicht.

NeoGriever
10.07.2013, 13:34
Es geht in diesem Post NICHT um das VMSR ... Was ist DARAN so schwer zu verstehen? Und nur, weil ich hier eine Kleinigkeit übersehen habe, was man mir durchaus vergeben kann, machst du hier so nen Aufstand? Hallo? Ich glaub mal, lange hier aktiv sein heißt nicht, alt genug sein. Dein Benehmen gleicht nämlich einem 7 jährigem Jungen, der unbedingt Recht behalten will, obwohl es schon lange bewiesen ist, dass er kein Recht hat.

Dass ich HIER 1 Fehler gemacht habe, das habe ich eingesehen. Und auch prompt korrigiert. Aber SOFORT am VMSR, welches wesentlich mehr Planung, Arbeit und Zeit gefressen hat, rummeckern und es hiermit gleich stellen ist ein NOGO.

Und du scheinst es ja noch nichmal zu raffen, dass das jetzige Problem nichts mit dem von mir vergessenen Sicherheits-Sachen zu tun hat, sondern damit, WIE du diesen Fehler gemeldet hast.

Nur zum Vergleich.
"Oh. An deiner Gabel fehlt eine Zacke. Das ist gefährlich. Du solltest besser kein Auto mehr fahren, wenn du nichtmal eine Gabel ganz lassen kannst."

SO hast du argumentiert.

Haste noch nen Fehler im Script gefunden? Wenn ja, dann sags mir. Wenn nein, dann (sorry für den Ausdruck) HALT DEN SCHACHT!!! -.-

jpwfour
11.07.2013, 12:28
:D Genau das meinte ich...

Btw: genau genommen ja 2 Fehler....

NeoGriever
11.07.2013, 12:39
Dann sei konstruktiv und sag einfach, welche Fehler und wie man sie ggf. beheben kann.

Derzeit bist du sehr destruktiv. Kein Wunder, dass das VMS nicht vorangekommen ist, bei solch einem User hier ...

Worka
13.07.2013, 13:44
... Und nur, weil ich hier eine Kleinigkeit übersehen habe, was man mir durchaus vergeben kann, machst du hier so nen Aufstand?

Mich macht alleine die Einschätzung stutzig.
Vergeben kann man es Dir auf jeden Fall Alleine schon weil Du hier den Code veröffentlicht hast, anstatt ein verbugtes Addon zu verkaufen.
Allerdings ist die Einschätzung des Fehlers als Kleinigkeit meiner Meinung nach ziemlich daneben.

Sowas kann JEDEM passieren.
Allerdings sollte derjenige dann auch erkenen, dass es sich eben NICHT um eine Kleinigkeit handelt.

Der Verweis auf das VMSR ist in meinen Augen auch OK.
Ich habe auch sofort an deine Arbeit am VMSR gedacht, als ich das hier gelesen habe.

Dass Du dann allerdings aufgrund der Tonart etwas ungehalten reagierst ist auch verständlich.

Trotzdem ist jpwfour mal einer ist der wirklich Ahnung hat und was von Seinem "Handwerk" versteht.
Auch wenn er Dir gegenüber grade etwas weniger freundlich ist, solltest Du erkennen, dass Sein Hinweis eigentlich Gold Wert ist.

NeoGriever
14.07.2013, 23:48
Habe seinen Hinweis auch direkt umgesetzt.

Es ist aus meiner Sicht ein Fehler, den ich schlichtweg übersehen habe, da die Änderung, die zur Korrektur nötig waren, kleinigkeiten waren.

Die offene Sicherheitslücke habe ich NICHT als kleinigkeit abgetan.

Ich bin dieser Diskussion langsam leid.