Строка в кодировке Base64 для простого внедрения SQL

За исключением проблемы с производительностью, является ли base64_encode () «хорошей» практикой для предотвращения внедрения SQL?

Конечно, не для всех полей (столбцов), а только для одного поля TEXT (пример: в форме контакта)

Мы знаем, что символы, возвращаемые функцией base64_encode (), являются «безопасными» и не нуждаются даже в экранировании (исправьте меня, если я ошибаюсь), но я хочу знать, является ли это «безопасным» в любой ситуации (кодировка кодировки или что-то подобное).

Простой практический пример:

$dbc = new mysqli( DBHOSTNAME, DBUSERNAME, DBPASSWORD );

$name = preg_replace( "#[^A-Za-z0-9@_]#", "", $_POST[ "name" ] );

$phone = preg_replace( "#[^0-9 +]#", "", $_POST[ "phone" ] );

/*
Assuming this function check and sanitize a valid email
*/
$email = is_email( $_POST[ "email" ] );

$dbc->query( "INSERT INTO `testdb`.`testtable`
( `name`, `email`,`phone`,`message` )
VALUES ( '$name', '$email', '$phone', '" . base64_encode( $_POST[ "message" ] ) . "' )" );

В другой стороны подготовлено заявление:

$dbc = new mysqli( DBHOSTNAME, DBUSERNAME, DBPASSWORD );

$name = preg_replace( "#[^A-Za-z0-9@_]#", "", $_POST[ "name" ] );
$phone = preg_replace( "#[^0-9 +]#", "", $_POST[ "phone" ] );

/*
Assuming this function check and sanitize a valid email
*/
$email = is_email( $_POST[ "email" ] );

$stmt = $dbc->prepare( " INSERT INTO `testdb`.`testtable`
( `name`, `email `phone`, `message` )
VALUES( '$name', '$email', '$phone', ? ) " );

$stmt->bind_param( 's', $_POST[ "message" ] );
$stmt->execute();

Мы должны иметь дело со всеми видами хакерских и инъекционных техник каждый день.

Логически PDO или mysqli (с подготовленным заявлением) безопасны, но в моем случае вывод (сообщение) в любом случае будет конвертирован в base64 (требуется для других частей проекта), так почему бы не выполнить конвертацию перед сохранением (ну и немного дополнительного места в базе данных)

2

Решение

Из-за природы функции base64_encode () (чтобы двоичные данные выдерживали перенос через транспортные уровни, которые не являются 8-битными), вам не нужно ничего избегать!

Возвращаемые символы: [0-9a-zA-Z /]

Но я настоятельно рекомендую вам использовать подготовленное утверждение (с mysqli или PDO). Немного медленнее, но вы не измените дезинфицирующая логика каждый раз, когда вы имеете дело со структурой таблицы.

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

Ваш второй пример верен (свяжите ВСЕ ваши параметры)

3

Другие решения

Функция base64_encode не предназначена для экранирования строк, то есть нет гарантии, что определенный диалект SQL не будет рассматривать какой-либо символ в кодировке base64 в качестве разделителя; Вы всегда должны полагаться на специальные функции escape.
Однако мы не знаем ни одного диалекта SQL, который бы рассматривал символ base64 в качестве разделителя, поэтому в любом случае это было бы безопасно.

2