Как отфильтровать параметры функции - PullRequest
1 голос
/ 18 июля 2011

Как правильно фильтровать параметры, передаваемые в функции?Цель состоит в том, чтобы сделать функцию безопасной, особенно при работе с базой данных.

Пример:

function user_profile($user_id)
{
   //get user's profile data
   $query = "SELECT * FROM `users` WHERE `user_id` = $user_id";
}

$user_id - это сегмент URI.

Другие общие примерыприветствуются

Ответы [ 6 ]

1 голос
/ 18 июля 2011

Если вашим полем user_id является строка в вашей базе данных, тогда вы будете использовать mysql_real_escape_string() или mysqli_real_escape_string(), илиPDO::quote() - в зависимости от API, с которым вы работаете :

$query = "SELECT * FROM `users` WHERE `user_id` = '" 
              . mysql_real_escape_string($user_id) . "'";

или

$query = "SELECT * FROM `users` WHERE `user_id` = '" 
              . mysqli_real_escape_string($user_id) . "'";

или с PDO- при условии, что $db является PDO объектом:

$query = "SELECT * FROM `users` WHERE `user_id` = '" 
              . $db->quote($user_id) . "'";


Но, , если это целое число , вы должны убедиться, что переданное ему значениедействительно целое число - которое обычно делается с помощью intval():

$query = "SELECT * FROM `users` WHERE `user_id` = " 
              . intval($user_id);

Редактировать: я только что понял, что вы сказали, что этоСегмент URL - так, а не целое число.Однако я не удаляю эту идею: она может помочь кому-то другому, кто прочтет этот ответ.


Другое решение состоит в том, чтобы не создавать запрос, содержащий это значение -и используйте подготовленные заявления .

См .:

1 голос
/ 18 июля 2011

Создайте класс фильтра для обработки всей вашей фильтрации.Прежде чем передать переменную в функцию в качестве параметра, сначала передайте ее через класс фильтра.Или пропустите параметр через класс фильтра в первой строке вашей функции.

По сути, вы создаете абстрактный слой, который «фильтрует».

Таким образом, тип фильтрации, который вы хотите выполнить в своем сценарии, - это фильтрация SQL-инъекций / инъекций кода..

Поэтому создайте обертку с этим классом фильтра вокруг функции mysql_real_escape_string().

Идея состоит в том, чтобы создать расширяемый класс фильтра, который может использоваться в любом месте вашего приложения, который концептуально высокдостаточно, чтобы справиться со всеми будущими потребностями.

final class Filter
{
    static public function sqlInjections($some_parameter)
    {
        // my code to prevent injections by filtering $some_parameter
        return mysql_real_escape_string($some_paramters);
    }

    static public function badWords()
    {
        // code in the future that can be added to filter bad words
    }
}

Назовите это так $filtered_parameter = Filter::sqlInjections($some_paramter);

1 голос
/ 18 июля 2011

Есть несколько способов.СТАРЫЙ способ - использовать mysql_real_escape_string(). Однако , многие люди в настоящее время горько жалуются на это и говорят, что правильный способ - использовать готовые заявления.

1 голос
/ 18 июля 2011

Для экранирования строк используйте тот же метод, который вы использовали бы вне функции:

$user_id= mysql_real_escape_string($user_id);

Если вы ожидаете, что значение будет, например, целым числом, и вы хотите вернуть ошибку изесли это не так, вы можете сделать что-то вроде:

if (!is_int($user_id)) {
  return FALSE;
}
else // do you query

Или, если вы ожидаете, что она будет соответствовать определенному шаблону, сделайте это с preg_match():

// For example, $user_id should be 4 letters and 4 numbers
if (!preg_match("/^[A-Z]{4}[0-9]{4}$/", $user_id)) {
   return FALSE;
}
else // do you query
0 голосов
/ 18 июля 2011

Вы можете сделать два или три взаимодополняющих способа предотвращения внедрения SQL:

  • Функции перехода, прокомментированные выше.

  • Запросите наоборот:

    функция user_profile ($ user_id) { // получить данные профиля пользователя $ query = "SELECT * FROM users WHERE {$ user_id} = user_id"; }

  • Пользователь подготавливает и выполняет функции / методы, если ваш движок базы данных позволяет это http://php.net/manual/en/pdo.prepare.php http://www.php.net/manual/en/pdostatement.execute.php

0 голосов
/ 18 июля 2011

Использование mysql_real_escape_string()

$query = "SELECT * FROM users WHERE user_id = '" . mysql_real_escape_string($user_id) . "'";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...