[Python]if/else problehm

07/07/2016 18:53 FireFox©#1
Hallo Com,

Da ich momentan daran bin eine etwas abgewandelte Version von Raiguard in meinen Client zu implementieren(Nein die Licence vom ersteller will ich nicht entfernen)bin ich auf einen sehr komischen Fehler gestoßen und vielleicht kann einer der Lieben Python götter mir hier helfen.

Kurz zum System:
Wenn man sich einloggt wird eine abfrage an den Server gestellt zwecks des Status des Guards.

0 = Aus
1 = An

Das ganze läuft über eine Php seite ähnlich wie bei raiguard:
PHP Code:
$accountdb_ip "xxxxxx"//Accountserver-IP
$accountdb_login "xxxxx"//Accountserver-Loginname
$accountdb_pw "xxxxxxxx"//Accountserver-Passwort
$db_ip "xxxxxxxx"//DB-Server-IP
$db_login "xxxxxx"//DB-Server-Loginname
$db_pw "xxxxxxx"//DB-Server-Passwort

$con mysql_connect($db_ip$db_login$db_pw);
$con_account mysql_connect($accountdb_ip$accountdb_login$accountdb_pw);
if (!
$con)
  {
  die(
'Could not connect: ' mysql_error());
  }
  
$pcid mysql_real_escape_string($_GET["pcid"], $con);
$login mysql_real_escape_string($_GET["login"], $con);
if(
$login != "" ){
$result_id mysql_query("SELECT * FROM account.account WHERE login='".$login."' LIMIT 1"$con);
$player_acc_id mysql_result($result_id0"id");
$result mysql_query("SELECT * FROM account.account WHERE id='".$player_acc_id."'"$con);
$status mysql_result($result0"raiguard");

if(
$status == 0)
    {echo 
"0";}
elseif(
$status == 1)
    {echo 
"1";}
elseif(
$status == 2)
    {echo 
"2";}
}

if(
$pcid != ""){
$result_id mysql_query("SELECT * FROM account.account WHERE login='".$pcid."' LIMIT 1"$con);
$player_acc_id mysql_result($result_id0"id");
$result mysql_query("SELECT * FROM account.account WHERE id='".$player_acc_id."'"$con);
$status mysql_result($result0"raiaccpin");
echo 
$status;    
}
mysql_close($con);
mysql_close($con_account); 
(Ja ich weiß das da eine mysql verbindung umsonst ist ;D fein tuneing)
Sie gibt erfolgreich bei ?login=accname oder ?pcid= Den Status 0 oder 1 oder den Pin aus.

nun zum script:
PHP Code:
def __OnClickLoginButton(self):
        
id self.idEditLine.GetText()
        
pwd self.pwdEditLine.GetText()
        
logintest str(id)
        
#dbg.LogBox(logintest)
        
protect urllib2.urlopen(HOMEPAGE "raiguardstatusig.php?login=" logintest).read()
        
dbg.LogBox(protect)
        
        
        if (
protect == "1"):
        
            if 
len(id)==0:
                
self.PopupNotifyMessage(localeInfo.LOGIN_INPUT_IDself.SetIDEditLineFocus)
            return

            if  
len(pwd)==0:
                
self.PopupNotifyMessage(localeInfo.LOGIN_INPUT_PASSWORDself.SetPasswordEditLineFocus)
            return
        
            
self.Connect(idpwd)
            
        else:
        
            
dbg.LogBox("Schon wieder fail!"
So das hier habe ich auch getestet also der client bekommt aus protect variable = 1 .

Der Fehler ist aber obwohl ich es hier mit:
PHP Code:
if (protect == "1"): 
gemacht habe springt er auch bei
PHP Code:
protect=
auf
PHP Code:
else:
        
            
dbg.LogBox("Schon wieder fail!"
ich habe auch schon:
PHP Code:
if (protect == "1"):
if (
protect == '1'):
if (
protect == 1):
if 
protect == "1"
if protect == '1':
if 
protect == 1
getestet aber ohne erfolg leider.

Ich nehme an das er aus der Homepage zusätzlich ein leerzeichen/zeile mit nimmt.Jetzt ist meinen frage wie ich es hinbekomme das er hier nicht die If bedingung überspringt sprich das protect = clientvariable ist.

Danke für eure Hilfe im Vorfeld
Mfg Fabejan

PS:Rechtschreibfehler bitte schenken(außer sie sind im code);D:handsdown:
07/07/2016 19:00 .Scy#2
wäre ja erstmal wichtig zu wissen, was genau dort mitgegeben wird.
print protect wäre da mal ne möglichkeit um zu gucken was ausgegeben wird, anschließend noch ein print dahinter hängen mit irgend einem inhalt, z.b. "test" oder so, falls dies in der nächsten reihe landet, weißt du, dass du mehr bekommst als nur die 1, zudem wäre es ja mal ne idee die seite einfach im browser aufzurufen und zu gucken was du dort bekommst.

mit burpsuite könntest du den kompletten inhalt den du bekommst angucken, da ich nicht weiß inwiefern urllib2 die http-header mit liest oder nicht, könntest du so auf deine antwort kommen.
07/07/2016 19:53 FireFox©#3
Danke dir ich habe vollgende ausgabe

>>> import urllib
>>> urllib.urlopen("xxxxxxxxxxxxxxxxxxxxxxxxx").read()
'1\n'
wie bekomme ich jetzt den zeilen umbruch daraus?

Lösung: protect = protect.strip()
if protect = "0"

Danke für deine Hilfe top! ohen dich wäre ich nicht auf "\n" bekommen
07/07/2016 20:12 Der-Eddy#4
Siehe Beitrag von Ente
07/07/2016 22:20 .Scy#5
Quote:
Originally Posted by Der-Eddy View Post
btw. fürs nächste mal
Code:
if (protect.find('1') != -1):
    #do something
Wenn protect keine 1 enthält dann wird -1 ausgegeben, ansonsten der Index der 1 im String
aber dann müsste man doch immer davon ausgehen, dass die anfrage nur 0 oder 1 zurück gibt und nie die möglichkeit besteht, dass 103213 drinnen steht oder whatever, richtig?
07/07/2016 22:56 FireFox©#6
ja alles gute danke euch habs jetzt sind halt immer die kleinen Fehler die einen aufhalten :D schönen abend
07/07/2016 23:36 Ende!#7
Quote:
Originally Posted by Der-Eddy View Post
btw. fürs nächste mal
Code:
if (protect.find('1') != -1):
    #do something
Wenn protect keine 1 enthält dann wird -1 ausgegeben, ansonsten der Index der 1 im String
Urghs, ganz und gar nicht pythonic. "in" / "not in" Operator usen:
Code:
if '1' in protect:
  pass