этот пример SQL-оператора считается параметризованным и, следовательно, безопасным? - PullRequest
0 голосов
/ 12 февраля 2012
$dbh->prepare("INSERT INTO whatever (col1,col2) values (%d,%s)",$_GET['unescaped_and_unfiltered_col1_value'],$_GET['unescaped_and_unfiltered_col2_value']);

Чем вышеупомянутый метод отличается от использования методов bindParam или bindValue в отношении экранирования SQL-Injection?

Ответы [ 2 ]

3 голосов
/ 12 февраля 2012

Если вы используете PDO.Это неправильно.

Взгляните на руководство PDO

Ваш код будет

$stmt = $dbh->prepare("INSERT INTO whatever (col1,col2) values (?, ?)");
$stmt->execute(array($_GET['key1'], $_GET['key2']));

Значения будут экранированы и защищеныиспользовать.

1 голос
/ 13 февраля 2012

Что ж, если вы собираетесь просто имитировать это поведение, используя некоторые символы, такие как% d, $ s, для представления ваших данных, без реализации какого-либо базового метода , это, очевидно, НЕ безопасно.Символы% d и $ s не имеют магического значения, что делает любые данные безопасными.

Если вы собираетесь использовать библиотеку , вы столкнетесь и хотите спросить, безопасна ли эта библиотека илинет, вы должны хотя бы назвать это, но лучше представить технологию , которую она использует, чтобы дать людям представление о том, что вы просите.

Хорошо, это все о символах.
Как я уже говорил выше, либо если вы имели в виду %s, а не $s, это просто заполнители функций printf () и не имеют никакого отношения ни к безопасности, ни к базам данных.

Тем не менее, вы все еще можете создать систему безопасности, реализующую такие заполнители, которые, конечно, должны избегать | связывать эти параметры на своем базовом уровне.

краткий пример такой функции:

function prepare() {
  $args = func_get_args();
  $query = array_shift($args);
  foreach ($args as $key => $val) {
    $args[$key] = mysql_real_escape_string($val);
  }
  return vsprintf($query, $args);
}

, используя ее таким образом

$sql = $dbh->prepare("INSERT INTO whatever (col1,col2) values (%d,'%s')",
                     $_GET['unescaped_and_unfiltered_col1_value'],
                     $_GET['unescaped_and_unfiltered_col2_value']);

, вы можете быть уверены, что сделали ваши значения данных безопасными.И все же идентификаторы и ключевые слова стали нуждаются в защите.

Надеюсь, я разобрался со всеми вещами.

...