Autor Wątek: mySQL  (Przeczytany 7606 razy)

Offline BrunonDEV

  • Użytkownik
    • Construgia -- RPG

# Styczeń 24, 2016, 19:11:59
Cytuj
Pozbyć można się łatwo, ale brutalnie - po sformatowaniu url'a usuń wszystkie \n ;). A jeżeli to faktycznie wina downloadera i dolepia tam coś to trimuj jego output.

Próbowałem tak:

std::string s;
s.erase(s.find_last_not_of(" \n\r\t")+1);

I też tak:

inline std::string trim(std::string& str)
{
str.erase(0, str.find_first_not_of(' '));
str.erase(str.find_last_not_of(' ')+1);
return str;
}
//...
trim(url);

I żaden z tych sposobów nie działa. BTW. Otworzyłem plik w Notepad++ i na końcu pierwszej linijki jest "CR LF".
« Ostatnia zmiana: Styczeń 24, 2016, 19:16:49 wysłana przez BrunonDEV »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline albireo

  • Użytkownik

# Styczeń 24, 2016, 20:17:22
Obstawiałbym, że w pliku .php, masz znak końca linii po ?>

Offline BrunonDEV

  • Użytkownik
    • Construgia -- RPG

# Styczeń 24, 2016, 21:46:25
Raczej nie. BTW. Udostępnię plik PHP, myślę, że nie da zbyt dużo wskazówek Przeciwnikom Construgii lub też niektórym rodzajom Złych Warsztatowiczów, którzy tylko marzą o zhackowaniu Construgii zaraz po aktualizacji MMO. :P

<?php
include ("dblog.php");

$mt $_GET["mt"];
$par1 $_GET["par1"];
$par2 $_GET["par2"];
$ID $_GET["id"];
$password $_GET["token"];

$zapytanie mysql_query("SELECT Password FROM EveryWorld WHERE ID = $ID");
$result mysql_fetch_array($zapytanie);
$realPass $result[0];

if(
$mt == "say"){
  echo 
$par1;
}
else if(
$mt == "save" && $password == $realPass){
  if(
$par1 == "lvl")
    
$zapytanie mysql_query("UPDATE EveryWorld SET LVL = '$par2' WHERE ID = $ID");
  else if(
$par1 == "exp")
    
$zapytanie mysql_query("UPDATE EveryWorld SET EXP = '$par2' WHERE ID = $ID");
  else if(
$par1 == "posx")
    
$zapytanie mysql_query("UPDATE EveryWorld SET posX = '$par2' WHERE ID = $ID");
  else if(
$par == "posy")
    
$zapytanie mysql_query("UPDATE EveryWorld SET posY = '$par2' WHERE ID = $ID");
}
else if(
$mt == "read" && $password == $realPass){
  if(
$par1 == "lvl"){
    
$zapytanie_ mysql_query("SELECT LVL FROM EveryWorld WHERE ID = '$ID'");
  }
  else if(
$par1 == "exp"){
    
$zapytanie_ mysql_query("SELECT EXP FROM EveryWorld WHERE ID = '$ID'");
  }
  else if(
$par1 == "posx"){
    
$zapytanie_ mysql_query("SELECT posX FROM EveryWorld WHERE ID = '$ID'");
  }
  else if(
$par1 == "posy"){
    
$zapytanie_ mysql_query("SELECT posY FROM EveryWorld WHERE ID = '$ID'");
  }
  
$wynik mysql_fetch_array($zapytanie_);
  echo 
$wynik[0];
}
else if(
$mt == "getid"){
  
$zapytanie_ mysql_query("SELECT ID FROM EveryWorld WHERE Login = '$par1'");
  
$wynik mysql_fetch_array($zapytanie_);
  echo 
$wynik[0];
}
else if(
$mt == "login"){
  if(
$password == $realPass)
    echo 
"done";
  else
    echo 
"wrong";
}
?>

Offline Karol

  • Użytkownik

# Styczeń 25, 2016, 14:23:44
Ten trim co podałeś to wycina tylko białe znaki na końcu tekstu, to by było dobre jeżeli byś tak robił na pobranej przez downloader treści, a nie na url'u który ma te znaki w środku. Nie jestem ekspertem C++, ale spróbuj to, wykonaj dwa razy, najpierw wywal \n, a potem \r.

str.erase(std::remove(str.begin(), str.end(), '\n'), str.end());
Co do kodu PHP to tu aż krzyczy o SQL Injection :) Jeżeli chcesz to pomogę Ci to poprawić (jak wrócę z roboty). A ?> na końcu nie musisz wstawiać, co eliminuje problem nieumyślnych znaków po tym znaczniku.
« Ostatnia zmiana: Styczeń 25, 2016, 14:34:15 wysłana przez Karol »

Offline Kos

  • Użytkownik
    • kos.gd

  • +2
# Styczeń 25, 2016, 17:12:50
mysql_query? Seriously? Budowanie kwerend sklejając stringi? Uczysz się właśnie wszystkiego najgorszego o webdevie :(

Nie wszedłeś jeszcze w PHP zbyt daleko, masz szansę. Spróbuj dla porównania popisać coś w Django albo w innych Railsach. A jak już musisz w PHP, to złap jakieś Symfony czy co tam się teraz używa.

Offline Karol

  • Użytkownik

  • +2
# Styczeń 25, 2016, 19:55:58
Nie wszedłeś jeszcze w PHP zbyt daleko, masz szansę. Spróbuj dla porównania popisać coś w Django albo w innych Railsach. A jak już musisz w PHP, to złap jakieś Symfony czy co tam się teraz używa.
Rada typu użyj armaty na komara. Wystarczy zamiast mysql_connect, mysql_query i całej reszty używać PDO, w max godzinkę się to ogarnie nawet dla początkującego i będzie dalej sobie robić co robił. Przyswajanie frameworka, albo nowego języka (którego nie uruchomi na swoim hostingu) to już w ogóle kosmos ;).

@BrunonDEV i jak tam, ktoś już zrobił Ci injection i wyczyścił całą bazę? :)

Tak na szybko, jak korzystać z PDO, wklej sobie tą klasę, może być w tym dblog.php bo pewnie tam masz dane do logowania, które dodajesz wszędzie gdzie chcesz się łączyć

class DBGateway {

private static $instance = null;
private $db = null;

public function __construct($dbUser, $dbPass, $dbName, $dbHost) {
$connectionString = sprintf('mysql:dbname=%s;host=%s', $dbName, $dbHost);
try {
$this->db = new PDO($connectionString, $dbUser, $dbPass);
$this->db->exec('SET NAMES UTF8;');
self::$instance = $this;
} catch (PDOException $e) {
die('Baza doopa ' . $e->getMessage());
}
}

public static function execute($query, $params) {

if (!self::$instance) {
return false;
}

$statement = self::$instance->db->prepare($query);
if ($statement->execute($params)) {
$statement->setFetchMode(PDO::FETCH_ASSOC);
return $statement->fetchAll();
} else {
die('Query doopa ' . $query);
return false; // gdybys wywalil te die powyzej to return ma sens :)
}
}

}

Na koniec umieść sobie taką magiczną linijkę
new DBGateway($username, $password, $nazwaBazy, $nazwaHosta);oczywiście podając adekwatne dane. I teraz jak z tego korzystać? Ano prosto. Zamiast mysql_query piszesz tak:
$wynik = DBGateway::execute('SELECT * FROM `apps` WHERE `app_id` >= ?;', array(1));Jako pierwszy parametr podajesz kwerendę, jako drugi tablicę parametrów, parametry są bindowane poprzez ?, pod pierwszy ? w zapytaniu jest wstawiana pierwsza wartość z tablicy, do drugiego druga itp. Pamiętaj też żeby pizdryczkami ` obejmować nazwy tabel i kolumn, nie jest to konieczne, ale warto, szczególnie jeżeli zechcesz użyć nazw kolumn identycznych jak słowa kluczowe SQL'a. No i wygląda bardziej pr0 elo trzy dwa zero :D.

Co dzięki temu zyskujesz? Nie musisz martwić się o eskejpowanie tego co user przysłał, oraz PDO nie wykona więcej niż 1 zapytania na raz, co uniemożliwia też wstrzykiwanie zapytań SQL.