sorgularda tırnak

4 Cevap php

Ben parametreleri ya "" veya'' içine gerektirir bir mysql sorgu var,

: Ben bu işleve geçirilen bir dizi varsa

function orderbyfield($column, array $selection)
{
 // will it be alright (secure) to do this?
 foreach ($selection as $s)
 {
  $s = '"' . $s . '"';
 }
 $string = implode(',', $selection)
 return array($column, $string);
}

ve onu geçmek

function generate_sql()
{
 $fields = $this->orderbyfield(); // assuming the code is in a class
 $sql = 'SELECT FIELDS FROM TABLE ORDER BY FIELD (' . $fields[0] . ',' . mysql_real_escape_string($fields[1]));
}

Bu yaklaşım ile herhangi bir güvenlik sorunları olacak?

EDIT assume that code is in a class, made necessary addition of $this->

EDIT typo on the foreach

4 Cevap

Diğerleri söylediler gibi mysql_real_escape_string kullanarak olmalıdır at the point where you create the query string. Veritabanı türleri arasında döküm mümkün olabilir, ancak aynı zamanda, tüm değişkenler sorgular kote edilmesi gerekir:

function enclose($val, $dbh)
{
  if (($val==='') || (is_null($val))) {
       return 'NULL';
  }
  // is it a number?
  if (preg_match('/^[\+-]*\d+\.?\d*$/', $val)) {
      return($val);
  }
  // its a string
  return("'" . mysql_real_escape_string($val, $dbh) . "'");
}

Boş taşıma tweaked gerekebilir. (Yukarıda da etc / kullanımı boş değerlere alıntı ne zaman ipuçları elde AÇıKLAYAN kullanarak tablonun yapısını okur kullandığım bir genel arabirimi aşağı kesilir)

C.

Eğer mysql_real_escape_string fonksiyonunu kullanarak çünkü, o kadar dizeleri ile ilgili olarak oldukça güvenlidir. dealing with sql injection daha fazla bilgi için bkz.

Eğer PDO's prepared statements kullanıyorsanız, size kendinizi kaçan hakkında endişelenmenize gerek yok. Hayır tırnak, hayır tersbölüler, hiçbir şey.