Вопрос: Как использовать подготовленные отчеты MySQLi со хранимыми процедурами


Я пытаюсь узнать больше о MySQL и о том, как защитить от SQL-инъекций, поэтому мои исследования привели меня к подготовленным заявкам, которые, похоже, идут по пути.

Я также работаю над тем, как писать хранимые процедуры, и теперь я пытаюсь объединить их. Однако об этом мало информации.

На данный момент в моем тестовом приложении PHP у меня есть функция, которая вызывает SP с обычной командой MySQL следующим образом:

mysql_query("CALL usp_inserturl('$longurl', '$short_url', '$source')");

Как я могу сделать то же самое с MySQLi и подготовленным заявлением, чтобы сделать его максимально безопасным для инъекций?

Благодаря!


4


источник


Ответы:


Вы можете найти следующий ответ на использование:

MySql: Будет ли использование подготовленных операторов для вызова хранимой процедуры быстрее с .NET / Connector?

К тому же:

GRANT выполняет разрешения только для того, чтобы пользователь (ы) уровня приложения мог только ЗАПИСАТЬ хранимые процедуры. Таким образом, пользователь (ы) приложения может взаимодействовать только с базой данных через ваш API хранимых процедур, они не могут напрямую:

select, insert, delete, update, truncate, drop, describe, show etc. 

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

При создании базы данных, например. foo_db, я обычно создаю двух пользователей. Первый foo_dbo (владелец базы данных) является пользователем, которому принадлежит база данных, и получает полные разрешения (ВСЕ), чтобы они могли создавать объекты схемы и манипулировать данными по своему усмотрению. Второму пользователю foo_usr (пользователю приложения) предоставляется только разрешение permisisons и используется из моего кода приложения для доступа к базе данных через API-интерфейс хранимой процедуры, который я создал.

grant all on foo_db.* to foo_dbo@localhost identified by 'pass';

grant execute on foo_db.* to foo_usr@localhost identified by 'pass';

Наконец, вы можете улучшить приведенный выше пример кода с помощью mysql_real_escape_string:

Надеюсь это поможет :)


2



Попробуйте следующее:

$mysqli= new mysqli(... info ...); 
$query= "call YourSPWithParams(?,?,?)"; 
$stmt = $mysqli->prepare($query); 
$x = 1; $y = 10; $z = 14;
$stmt->bind_param("iii", $x, $y, $z); 
$stmt->execute(); 

5



Вы можете использовать оба из них в одно и то же время: просто подготовьтесь с хранимой процедурой:

//prepare and bind SP's parameters with your variables only once
$stmt=$db->prepare("CALL MyStoredProc(?,?)");
$stmt->bind_param('is',$i,$name);

//then change binded variables and execute statement multiple times
for($i=1;$i<9;$i++)
{
  $name="Name".$i;
  $stmt->execute();
}

0