Mysql
 sql >> база данни >  >> RDS >> Mysql

Разлика между real_escape_string и подготви ()?

Ескейпирането е също толкова ефективно при защита от SQL инжекция, колкото и използването на параметри на заявка.

И двата метода също са по-малко ефективни, ако не ги правите последователно.

И двата метода са полезни само за защита на индивидуални стойности в SQL изрази. Те не поддържат други динамични части на заявката. Например, ако искате да ПОРЪЧИТЕ ПО посочена от потребителя колона. Нито параметрите на заявката, нито функциите за екраниране се справят с това.

Така че по принцип това е въпрос на стил и лични предпочитания.

Предпочитам параметри на заявката, защото мисля така:

$sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES (?, ?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$a, $b, $c]);

По-ясно е от това:

$sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES ('".mysqli_real_escape_string($conn, $a)."', '".mysqli_real_escape_string($conn, $b)."', '".mysqli_real_escape_string($conn, $c)."')";
mysqli_query($conn, $sql);

Не може сериозно да го кажете, че се занимавате с всички тези отворени/затварящи кавички и . конкатенацията на низове е по-лесна от използването на подготовка() с параметри на заявката.

Повторете вашите коментари за хипотетичен query() функция с параметри.

На първо място, не е необходимо. Използването на подготовка() и execute() заедно е малка цена за писане на защитен код и като настоявате да го правите с една функция, просто звучите мързеливи. Предполагам, че не проверявате върнатата стойност на функции, които връщат false при грешка?

За каквото си струва, би било лесно да се напише функция за обвиване, която да прави и двете, защото PHP поддържа неявно varargs.

function myquery() {
  global $pdo;
  $params = func_get_args();
  $sql = array_shift($params);
  $stmt = $pdo->prepare($sql);
  $stmt->execute($params);
  return $stmt; // so we can fetch(), etc.
}



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ap_pass_brigade не успя във функцията handle_request_ipc

  2. Вмъкнете множество записи от datagridview в моята таблица на база данни, използвайки VB.NET

  3. актуализиране на стойностите на колоните с колона на друга таблица въз основа на условие

  4. Не може да се свърже с отдалечен MySQL сървър

  5. Метеор с mysql