Я давно использую этот код на своем веб-сайте и просто хочу убедиться, что я правильно санационирую свои входы PHP $_POST
…
foreach($_POST as $key=>$val) //this code will sanitize your inputs. $_POST[$key] = mysqli_real_escape_string($connection, $val);
Скажем, например, у меня было значение POST $_POST['comment']
которое я хотел добавить в базу данных, будет ли это хорошим и безопасным способом санации его перед входом в базу данных?
foreach($_POST as $key=>$val) //this code will sanitize your inputs. $_POST[$key] = mysqli_real_escape_string($connection, $val); //is this safe? or is there another step? $comment = $_POST['comment']; if($comment != ""){ //add $comment to database }
Есть ли что-то, что мне еще нужно сделать, прежде чем добавлять $comment
в базу данных MYSQL? Или эти две верхние линии сами делают магию? Пожалуйста, дайте мне знать, если это хороший безопасный способ сделать это, или если есть еще лучший способ! Благодаря!
Возможный дубликат: https://stackoverflow.com/questions/15664021/php-escaping-vars-posted-through-var-and-got-by-postvari-with-a-meth
Я уже пробовал свой путь. Кажется, нет волшебной функции. Однако из классических MySQL-инъекций вы можете быть в безопасности при добавлении mysqli_real_escape_string к каждому опубликованному значению, затем использовать его как строку (цитируемую) в db, но это считается плохой практикой, также не самый безопасный способ
Поскольку MySQLi представляет параметризованные запросы, вы должны ознакомиться с ними и оставить реальную информацию, соответствующую драйверу базы данных, библиотеке.
Это не. Можно использовать многобайтовые атаки, которые будут обходить все эти дезинфицирующие средства.
Более того,
В соответствии с этим ответом следует избегать написания сообщения, чтобы можно было сохранить дезинфицированный код далеко не без санитарии. Даже если вы «санируете» все, это приводит к вредным привычкам.
Это не очень хороший способ дезинформировать ввод. Запросы должны быть параметризованы, а вход должен подаваться как аргументы независимо от того, откуда он исходит. Никакой дополнительной санитарии не следует делать (иначе ее можно было бы дублировать).
Если у вас есть определенные правила (например, $comment != ""
), Это проверка , и вам решать правила проверки и способы обработки недопустимого ввода (который отличается от неанитированного ввода).
Пример использования правильно параметризованного подготовленного оператора с mysqli:
$stmt = mysqli_prepare($connection, "INSERT INTO comments VALUES (?)"); mysqli_stmt_bind_param($stmt "s", $comment); mysqli_execute($stmt);
_real_escape_string
не дезинфицирует пользовательские входы. Вы должны использовать подготовленные заявления.
Объектно-ориентированный стиль
$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)"); $stmt->bind_param('sssd', $code, $language, $official, $percent); $code = 'DEU'; $language = 'Bavarian'; $official = "F"; $percent = 11.2;
Процедурный стиль
$stmt = mysqli_prepare($link, "INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)"); mysqli_stmt_bind_param($stmt, 'sssd', $code, $language, $official, $percent); $code = 'DEU'; $language = 'Bavarian'; $official = "F"; $percent = 11.2;
Типы параметров
Описание персонажа i соответствующая переменная имеет тип integer d соответствующая переменная имеет тип double Соответствующая переменная имеет тип string b соответствующая переменная является блобом и будет отправлена в пакетах
Документация
что вы калечите почтовые ящики, поэтому не можете использовать их для других целей, кроме запросов. например, что, если вы все еще хотели бы откликнуться на некоторые пост-варны?
лучше бежать к новому массиву
и даже лучше не избегать, а использовать параметризованные запросы.
Ваши недостающие некоторые из самых важных вещей для безопасного кодирования PHP.
Давайте начнем с самого начала.
Начните с этих ссылок: Пожалуйста, прочитайте комментарии к коду
Это первая // и эта вторая!
1) Проверяйте и затем фильтруйте свои данные, если они прошли проверку!
Таким образом, у нас есть регистрационная форма, в которой используются электронные письма … так что теперь мы проверяем электронную почту.
$email = $_POST['email']; // Declare the variable if (filter_var($email, FILTER_VALIDATE_EMAIL)) { // If validation passes ... $safe_email = filter_var($email, FILTER_SANITIZE_EMAIL) // Sanitize the email } else { // Validation fails no need to sanitize echo "WRONG EMAIL PUNK!!!!"; }
2) Теперь, используя Mysqli или PDO (я предпочитаю PDO), мы делаем:
$dbh = new PDO("mysql:host=xxxxxx;dbname=xxxxxx;charset=utf8", USERNAME(XXXXXXXXX), PASSWORD(XXXXXXXX); // Set up the PDO instance PLEASE DO NOT FORGET TO EXPLICETELY STATE A CHARSET!!!! $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Set up error mode $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE); // I prefer emulate prepares to be false $sql = INSERT INTO ..... (........., email) VALUES (............, :email); // Set up our named parameter $query -> $dbh -> prepare($sql); // Prepare the query $query -> bindParam (':email', $email); $query -> execute() // Yay!
Его все прекрасное и денди, использующее PDO и MysqlI, но есть выражение, называемое:
Its not the wand, its the wizard.
PDO / MysqlI не может все решить! Убедись в
См. Мой другой вопрос о том, как настроить PDO
1) Подтвердить 2) Санизировать 3) использовать параметры для более безопасных запросов! 4) Избегайте любых внешних (недостоверных данных)
Следуйте этим правилам безопасности PHP для более безопасного кодирования php.
наслаждаться