Спречите СКЛ инјекцију Ц++

Jansen

Početnik
Poruka
3
bool run_query(sqlite3* db, const std::string& sql, std::vector< user_record >& records)
{

// clear any prior results
records.clear();

char* error_message;
if(sqlite3_exec(db, sql.c_str(), callback, &records, &error_message) != SQLITE_OK)
{
std::cout << "Data failed to be queried from USERS table. ERROR = " << error_message << std::endl;
sqlite3_free(error_message);
return false;
}

return true;
}[/ICODE]

Како да поправим овај метод да не успе и прикаже грешку ако постоји сумња на СКЛ ињекцију?
 
Poslednja izmena od moderatora:
bool run_query(sqlite3* db, const std::string& sql, std::vector< user_record >& records)
{

// clear any prior results
records.clear();

char* error_message;
if(sqlite3_exec(db, sql.c_str(), callback, &records, &error_message) != SQLITE_OK)
{
std::cout << "Data failed to be queried from USERS table. ERROR = " << error_message << std::endl;
sqlite3_free(error_message);
return false;
}

return true;
}[/ICODE]

Како да поправим овај метод да не успе и прикаже грешку ако постоји сумња на СКЛ ињекцију?
sql inekcija se zasniva na tome da sql upit bude deo query-ja. Dakle ako se upit ne vidi u query-ju, nema ni sql inekcije...
Dakle nema veze sa izlozenim...
 
Пише се и каже се инјекција. Проблем је до латинице. На латиници кад се пише инјекција и ињенкција пише се исто (injekcija) и отуда долази до забуне док на ћирилици не.
Ja se ne bih bavio gramatikom nego time da bacanje vektora u sql3_exec pravi bug, posto C ne zna za vektore...
 
Користите припремљене СКЛ изразе који прихватају променљиве везивања за вредности пренете у СКЛ израз. То важи за свако окружење, не само за Ц++.
Ako izlozis promenljive direktno iz http query-ja u sql query, ranjiv si na sql injekciju (ajd da ispostujem Dzeksona :))
 
da bi sprečio SQl injekciju u ovom kodu, možeš koristiti sqlite3_prepare_v2() funkciju umesto sqlite3_exec()
Ova funkcija uzima SQL naredbu kao ulaz i kreira pripremljeni objekat iskaza koji se može koristiti za bezbedno izvršavanje SqL naredbe
onda možeš da povežeš vrednosti sa pripremljenom naredbom pomoću funkcija sklite3_bind_*() da bi spreččio da se zlonamerni unos tretira kao deo SQL izjave
 
da bi sprečio SQl injekciju u ovom kodu, možeš koristiti sqlite3_prepare_v2() funkciju umesto sqlite3_exec()
Ova funkcija uzima SQL naredbu kao ulaz i kreira pripremljeni objekat iskaza koji se može koristiti za bezbedno izvršavanje SqL naredbe
onda možeš da povežeš vrednosti sa pripremljenom naredbom pomoću funkcija sklite3_bind_*() da bi spreččio da se zlonamerni unos tretira kao deo SQL izjave
Ne znas, nije problem u bazi koju koristis vec u izlozenosti internetu... ma sta uradio ako korisnik u okviru http query-a moze da proturi
sql query, ranjiv si na injection... obicno se radi o sql varijablama koje se citaju direktno iz upita i konstruise
sql query, koje se zamene upitom...
 
Испробајте овај код, кориснички улази су везани за параметре у СКЛ упиту помоћу функција склите3_бинд_*, што помаже у спречавању напада СКЛ ињекцијом:
Kod:
bool run_query(sqlite3* db, const std::string& sql, std::vector< user_record >& records)
{
  // clear any prior results
  records.clear();

  sqlite3_stmt* statement;
  int result = sqlite3_prepare_v2(db, sql.c_str(), -1, &statement, nullptr);
  if (result != SQLITE_OK)
  {
    std::cout << "Data failed to be queried from USERS table. ERROR = " << sqlite3_errmsg(db) << std:: endl;
    return false;
  }

  result = sqlite3_step(statement);
  while (result == SQLITE_ROW)
  {
    user_record record;
    // code to retrieve the results and store them in the user_record struct

    records.push_back(record);
    result = sqlite3_step(statement);
  }

  if (result != SQLITE_DONE)
  {
    std::cout << "Data failed to be queried from USERS table. ERROR = " << sqlite3_errmsg(db) << std:: endl;
    sqlite3_finalize(statement);
    return false;
  }

  sqlite3_finalize(statement);
  return true;
}
 
Испробајте овај код, кориснички улази су везани за параметре у СКЛ упиту помоћу функција склите3_бинд_*, што помаже у спречавању напада СКЛ ињекцијом:
Kod:
bool run_query(sqlite3* db, const std::string& sql, std::vector< user_record >& records)
{
  // clear any prior results
  records.clear();

  sqlite3_stmt* statement;
  int result = sqlite3_prepare_v2(db, sql.c_str(), -1, &statement, nullptr);
  if (result != SQLITE_OK)
  {
    std::cout << "Data failed to be queried from USERS table. ERROR = " << sqlite3_errmsg(db) << std:: endl;
    return false;
  }

  result = sqlite3_step(statement);
  while (result == SQLITE_ROW)
  {
    user_record record;
    // code to retrieve the results and store them in the user_record struct

    records.push_back(record);
    result = sqlite3_step(statement);
  }

  if (result != SQLITE_DONE)
  {
    std::cout << "Data failed to be queried from USERS table. ERROR = " << sqlite3_errmsg(db) << std:: endl;
    sqlite3_finalize(statement);
    return false;
  }

  sqlite3_finalize(statement);
  return true;
}
Netje to itji... lakshe je parsovati http query i onda bindovati za svaki upit... ovako ni ne znash kakav je upit i shta treba da bindujesh...
 

Back
Top