Как использовать подготовленные операторы MySQLi с хранимыми процедурами - PullRequest
5 голосов
/ 04 апреля 2011

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

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

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

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

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

Спасибо!

Ответы [ 3 ]

5 голосов
/ 04 апреля 2011

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

$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(); 
2 голосов
/ 04 апреля 2011

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

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

Дополнительно:

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

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

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

При создании базы данных, например foo_db, я обычно создаю двух пользователей. Первый foo_dbo (владелец базы данных) - это пользователь, которому принадлежит база данных и которому предоставлены полные разрешения (ВСЕ), чтобы они могли создавать объекты схемы и манипулировать данными по своему усмотрению. Второму пользователю foo_usr (пользователь приложения) предоставляются только разрешения на выполнение, и он используется из кода моего приложения для доступа к базе данных через 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:

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

0 голосов
/ 26 июля 2016

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

//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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...