Предполагая, что имена ролей уникальны, вы действительно можете запросить базу данных и проверить, существует ли уже роль с таким именем. Если нет, мы идем вперед и создаем роль.
Это хорошо работает для меня:
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.");
})()
Используйте подготовленные операторы вместо того, чтобы смешать оператор и данные фактической полезной нагрузки.
посмотрите
Вы могли бы также интересоваться http://shiflett.org/articles/sql-injection и http://shiflett.org/blog/2007/sep/the-unexpected-sql-injection
Никому не доверяйте!
Санируйте весь вход- filter_var()
или regexes или in_array()
из допустимых значений или смешанной стратегии в зависимости от типа данных.
"Вход" означает любой источник входа, которым Вы непосредственно не управляете - не, просто формируется!
Санируйте что-либо, из чего Вы возвращаетесь $_GET
, $_POST
, $_SESSION
, $_COOKIE
- что-либо, что могло иметь любую возможность того, чтобы быть испорченным.
И
Используйте подготовленные операторы
Необходимо санировать весь вход. Как можно сделать, это зависит от программирования languaguage и/или платформы, с которой Вы работаете.
править:
При использовании php функция, Вы ищете, mysql_real_escape_string ($string). Необходимо использовать это на всем, что Вы получаете от клиента, который должен войти в базу данных.
Если Вы не используете платформу, которая предоставляет Вам очистку инструментов PHP, имеет созданный в строковом беглеце, необходимо запустить там. Можно найти документацию относительно этого в рамках документов PHP для mysql реальной строки Escape. При рассмотрении примера три, Вы получите хорошую идею основ, за которыми можно следовать.
Другой метод, за которым я следую, должен удостовериться, что я бросил переменные в соответствующих случаях. Например, если я буду ожидать, что вход от пользователя будет целым числом, то я сделаю следующее:
$age = (int)$age;
Также, если столбец, как предполагается, ограничен одним или двумя значениями (например, гендерный столбец) удостоверяются, что Вы осуществляете это в своем PHP прежде, чем поместить его в базу данных.
Знак, что у Вас могла быть проблема, будет брать ввод данных пользователем непосредственно и помещать ее в Вашу команду SQL.
Например, Вы просите их имя пользователя. Если Вы берете его и затем просто говорите
"Выберите * от пользователей где имя пользователя = '$USERNAME'";
Пользователь мог затем добавить "JOE'; Таблица Отбрасывания..." и так далее.
В жемчуге можно сказать что-то как
my $sth2 = $dbh->prepare("Insert Into HostList (HostName,PollTime,Status) values (?,?,?);");
$sth2->execute($Hostname,$myDate,$Status);
Выполнить метод затем искал бы использование, такое как то выше и вышел бы из него правильно.
Я использую эту функцию 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);
}
Это может походить на здравый смысл, но я был сбит с толку на нем некоторое время.
Существует различие между кодированием htmlentities()
и выход mysql_real_escape_string()
. Я думал о них как довольно взаимозаменяемых. Однако там не..., поскольку здравый смысл скажет Вам.:) Обычно лучше применять их обоих, такой, поскольку сначала кодируют, затем выходят.
Затем, когда получение по запросу данных инвертирует процесс, не выходит (в случае необходимости) затем не кодируют. Отметьте быть конкретным в способе, которым шаги выполняются (и инвертируются), сохранит много головных болей и дважды выходящего горя.