sql >> Databasteknik >  >> RDS >> Mysql

hur säkra är SUB-utlåtanden

Strängt taget behövs det faktiskt ingen flykt, eftersom parametervärdet aldrig interpoleras i frågesträngen.

Sättet som frågeparametrar fungerar är att frågan skickas till databasservern när du anropade prepare() , och parametervärden skickas senare när du anropade execute() . Så de hålls åtskilda från frågans textform. Det finns aldrig en möjlighet för SQL-injektion (förutsatt PDO::ATTR_EMULATE_PREPARES är falskt).

Så ja, frågeparametrar hjälper dig att undvika den typen av säkerhetssårbarhet.

Är de 100% bevis mot någon säkerhetsrisk? Nej, självklart inte. Som du kanske vet tar en frågeparameter bara platsen för ett enda bokstavligt värde i ett SQL-uttryck. Du kan inte ersätta en lista med värden med en enda parameter, till exempel:

SELECT * FROM blog WHERE userid IN ( ? );

Du kan inte använda en parameter för att göra tabellnamn eller kolumnnamn dynamiska:

SELECT * FROM blog ORDER BY ?;

Du kan inte använda en parameter för någon annan typ av SQL-syntax:

SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;

Så det finns en hel del fall där du måste manipulera frågan som en sträng, innan prepare() ringa upp. I dessa fall måste du fortfarande skriva kod noggrant för att undvika SQL-injektion.



  1. Få summan av MySQL-kolumnen i PHP

  2. Hur man visar rader som inte finns i en annan tabell i MySQL

  3. Hur använder man Oracle ORDER BY och ROWNUM korrekt?

  4. Exportera MySQL eller MariaDB-databas