MySQL защита от инъекций и признаки уязвимости с использованием PHP

Предполагая, что имена ролей уникальны, вы действительно можете запросить базу данных и проверить, существует ли уже роль с таким именем. Если нет, мы идем вперед и создаем роль.

Это хорошо работает для меня:

const createRole = async ({role, permissions}) => {
    const matches = await RoleModel.find({role}).exec();

    if (matches.length === 0) {
        return RoleModel.create({role, permissions});
    }
};

Затем метод может быть вызван следующим образом (, если вы уже подключились к базе данных ):

const userRole = {
    role: "User",
    permissions: ["readPost", "commentPost", "votePost"]
};

(async () => {
    await createRole(userRole);
    console.log("User role has been created successfully.");
})()
8
задан Peter Mortensen 21 April 2010 в 17:34
поделиться

7 ответов

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

посмотрите

Вы могли бы также интересоваться http://shiflett.org/articles/sql-injection и http://shiflett.org/blog/2007/sep/the-unexpected-sql-injection

15
ответ дан 5 December 2019 в 06:39
поделиться

Никому не доверяйте!

Санируйте весь вход- filter_var() или regexes или in_array() из допустимых значений или смешанной стратегии в зависимости от типа данных.

"Вход" означает любой источник входа, которым Вы непосредственно не управляете - не, просто формируется!

Санируйте что-либо, из чего Вы возвращаетесь $_GET, $_POST, $_SESSION, $_COOKIE - что-либо, что могло иметь любую возможность того, чтобы быть испорченным.

И

Используйте подготовленные операторы

8
ответ дан 5 December 2019 в 06:39
поделиться

Необходимо санировать весь вход. Как можно сделать, это зависит от программирования languaguage и/или платформы, с которой Вы работаете.

править:

При использовании php функция, Вы ищете, mysql_real_escape_string ($string). Необходимо использовать это на всем, что Вы получаете от клиента, который должен войти в базу данных.

1
ответ дан 5 December 2019 в 06:39
поделиться

Если Вы не используете платформу, которая предоставляет Вам очистку инструментов PHP, имеет созданный в строковом беглеце, необходимо запустить там. Можно найти документацию относительно этого в рамках документов PHP для mysql реальной строки Escape. При рассмотрении примера три, Вы получите хорошую идею основ, за которыми можно следовать.

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

$age = (int)$age;

Также, если столбец, как предполагается, ограничен одним или двумя значениями (например, гендерный столбец) удостоверяются, что Вы осуществляете это в своем PHP прежде, чем поместить его в базу данных.

1
ответ дан 5 December 2019 в 06:39
поделиться

Знак, что у Вас могла быть проблема, будет брать ввод данных пользователем непосредственно и помещать ее в Вашу команду SQL.

Например, Вы просите их имя пользователя. Если Вы берете его и затем просто говорите

"Выберите * от пользователей где имя пользователя = '$USERNAME'";

Пользователь мог затем добавить "JOE'; Таблица Отбрасывания..." и так далее.

В жемчуге можно сказать что-то как

my $sth2 = $dbh->prepare("Insert Into HostList (HostName,PollTime,Status) values (?,?,?);");
$sth2->execute($Hostname,$myDate,$Status);

Выполнить метод затем искал бы использование, такое как то выше и вышел бы из него правильно.

0
ответ дан 5 December 2019 в 06:39
поделиться

Я использую эту функцию PHP на всем входе, прежде чем я попытаюсь использовать его в любом коде (запрос MySQL, дисплей данных, и т.д.). Это, вероятно, не завершено, но это должно остановить все основные попытки взламывания системы:

//$linkID is the link ID of the connection to the MySQL database
function clean_input($input)
{
    GLOBAL $linkID;
    if(get_magic_quotes_gpc())
    {
        //Remove slashes that were used to escape characters in post.
        $input = stripslashes($input);
    }
    //Remove ALL HTML tags to prevent XSS and abuse of the system.
    $input = strip_tags($input);
    //Escape the string for insertion into a MySQL query, and return it.
    return mysql_real_escape_string($input,$linkID);
}
-1
ответ дан 5 December 2019 в 06:39
поделиться

Это может походить на здравый смысл, но я был сбит с толку на нем некоторое время.

Существует различие между кодированием htmlentities() и выход mysql_real_escape_string(). Я думал о них как довольно взаимозаменяемых. Однако там не..., поскольку здравый смысл скажет Вам.:) Обычно лучше применять их обоих, такой, поскольку сначала кодируют, затем выходят.

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

1
ответ дан 5 December 2019 в 06:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: