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

Необходимо ли е да се използва mysql_real_escape_string(), когато magic_quotes_gpc е включен?

За някои редки кодировки, като GBk - да.
Но не трябва да го върнете по тази причина. Вълшебните кавички трябва да бъдат изключени така или иначе (и ще бъдат в следващата версия на PHP). Така че, mysql_real_escape_string() е единствената останала escape функция. Имайте предвид, че това не е функция за предотвратяване на инжектиране на sql. Много много хора не разбират тази точка:това е просто част от синтаксиса. Трябва да се използва не за "защита" на нещо, а за сглобяване на синтактично правилна SQL заявка. И трябва да се използва всеки път, когато създавате заявката си, без значение откъде идват данните. Разбира се, това ще ви предпази и от SQL инжекции като страничен ефект.
Разбира се, mysql_real_escape_string() работи само в низове в кавички. Така че, ако го направите

$num=mysql_real_escape_string($num);
$sql="SELECT INTO table SET data=$num"; /BAD!!!

Няма да защити нищо. Ако ще използвате числа без кавички, задължително трябва да бъде прехвърлен на правилния тип, както следва:

$num=intval($num);
$sql="SELECT INTO table SET data=$num"; /GOOD
  • Имайте предвид, че mo make mysql_real_escape_string() работи по предназначение, трябва да бъде зададено правилно клиентско кодиране и е възможно само с mysql_set_charset() функция, заявката SET NAMES няма да зададе това.

Ако искате да се отървете от всички тези сложности, можете да използвате подготвени изявления , въпреки че ще трябва да превключите вашия mysql драйвер към mysqli или PDO.

Моля, имайте предвид, че нито правилен синтаксис, нито подготвени изрази няма да ви помогнат с части от заявката, различни от литерали. Не можете да избягате от идентификатори или оператори. Ако случайно използвате тези части динамично, те трябва да бъдат твърдо кодирани във вашия скрипт, както следва (за клаузата ORDER BY):

$orders=array("name","price","qty");
$key=array_search($_GET['sort'],$orders));
$orderby=$orders[$key];
$query="SELECT * FROM `table` ORDER BY $orderby";

или това (клауза WHERE)

$w=array();
if (!empty($_GET['rooms'])) $w[]="rooms='".mysql_real_escape_string($_GET['rooms'])."'";
if (!empty($_GET['space'])) $w[]="space='".mysql_real_escape_string($_GET['space'])."'";
if (!empty($_GET['max_price'])) $w[]="price < '".mysql_real_escape_string($_GET['max_price'])."'";

if (count($w)) $where="WHERE ".implode(' AND ',$w); else $where='';
$query="select * from table $where";


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Множество оператори за избор в единична заявка

  2. Как да създадете индекс FULLTEXT на множество колони?

  3. MySQL:Съкращаване на таблица срещу изтриване от таблица

  4. Задайте максимално време за изпълнение в MYSQL / PHP

  5. Как да добавя колона с помощта на alter в mysql?