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

Трябва ли да използвате подготвени изявления само за тяхното избягване?

Разликата се счита за незначителна.

Независимо от това, човек трябва да разграничи изготвените изявления от общата идея на подготвено изявление.

Първият е просто форма на изпълнение на заявки, поддържани от повечето СУБД, обяснено тук . Използването му може да бъде поставено под въпрос.
Последното е обща идея за заместване на действителните данни с заместител, което предполага по-нататъшна обработка на заместените данни. Той е широко използван в програмирането, добре познат printf() функция е пример. И този последен подход трябва ВИНАГИ да се използва за изпълнение на заявка към база данни , без значение дали е подкрепено от подготвени изявления или не. Защото:

  • подготвеното изявление прави правилното форматиране (или обработка) неизбежно .
  • prepared statement прави правилно форматиране (или обработка) на единственото подходящо място - точно преди изпълнението на заявката, а не някъде другаде, така че нашата безопасност няма да разчита на такива ненадеждни източници като
    • някаква „магическа“ функция на PHP, която по-скоро разваля данните, отколкото ги прави безопасни.
    • добра воля на един (или няколко) програмисти, които могат да решат да форматират (или да не форматират) нашата променлива някъде в потока на програмата. Това е моментът от голямо значение.
  • prepared statement засяга самата стойност, която влиза в заявката, но не и променливата източник, която остава непокътната и може да се използва в следващия код (да бъде изпратен по имейл или да се покаже на екрана).
  • подготвеното изявление може да направи кода на приложението драстично по-кратък, извършвайки цялото форматиране зад кулисите (*само ако драйверът позволява).

Така че, дори и да помислите да не използвате подготвени изрази (което е съвсем добре), винаги трябва да създавате заявките си, като използвате заместители вместо действителните данни. За тази цел можете да използвате PDO , който работи точно както е описано по-горе - по подразбиране просто имитира подготовка , означава редовна SQL заявка, която се създава от подготвена заявка и данни и след това се изпълнява срещу база данни.

Въпреки това, PDO няма поддръжка за много важни типове данни, като идентификатор или масив - по този начин ви прави неспособни винаги да използвате заместители и по този начин прави инжектирането напълно възможно. За щастие, safeMysql има заместители за всеки тип данни и ви позволява да изпълнявате заявки безопасно.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JOIN срещу WHERE:Защо две заявки, които получават идентични резултати, показват 3-4 порядъка на разлика в производителността?

  2. Изтрийте от една таблица с присъединяване

  3. Как да изтриете редове от три таблици - грешка в заявката

  4. MySQL присъединява много към много единичен ред

  5. Шаблонът на името на таблицата не може да бъде NULL или празен в java