Способы дезинфекции ввода пользователя с помощью PHP:
-
Использовать современные версии MySQL и PHP.
-
Установите кодировку явно:
$mysqli->set_charset("utf8");
manual $pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF8', $user, $password);
manual $pdo->exec("set names utf8");
manual $pdo = new PDO(
"mysql:host=$host;dbname=$db", $user, $pass,
array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
)
);
manual mysql_set_charset('utf8')
[устарела в PHP 5.5.0, удалена в PHP 7.0.0]. -
Использовать безопасные кодировки:
Выберите utf8, latin1, ascii .., не используйте уязвимые кодировки big5, cp932, gb2312, gbk, sjis. -
Использовать пространственную функцию:
Подготовленные команды MySQLi: $stmt = $mysqli->prepare('SELECT * FROM test WHERE name = ? LIMIT 1');
$param = "' OR 1=1 /*";
$stmt->bind_param('s', $param);
$stmt->execute();
PDO :: quote () - помещает кавычки вокруг (если требуется) и экранирует специальные символы во входной строке, используя стиль цитирования, соответствующий базовому драйверу: $pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF8', $user, $password);explicit set the character set
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);disable emulating prepared statements to prevent fallback to emulating statements that MySQL can't prepare natively (to prevent injection)
$var = $pdo->quote("' OR 1=1 /*");not only escapes the literal, but also quotes it (in single-quote ' characters)
$stmt = $pdo->query("SELECT * FROM test WHERE name = $var LIMIT 1");
Подготовленные отчеты PDO : vs подготовленные операторы MySQLi поддерживают больше драйверов баз данных и именованных параметров : $pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF8', $user, $password);explicit set the character set
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);disable emulating prepared statements to prevent fallback to emulating statements that MySQL can't prepare natively (to prevent injection)
$stmt = $pdo->prepare('SELECT * FROM test WHERE name = ? LIMIT 1');
$stmt->execute(["' OR 1=1 /*"]);
mysql_real_escape_string [устарела в PHP 5.5.0, удалена в PHP 7.0.0]. mysqli_real_escape_string Вызывает специальные символы в строке для использования в инструкции SQL, принимая во внимание текущую кодировку соединения. Но рекомендуется использовать подготовленные заявления, потому что они не просто экранированные строки, а инструкция содержит полный план выполнения запроса, включая таблицы и индексы, которые он будет использовать, это оптимизированный способ. Используйте одиночные кавычки ('') вокруг ваших переменных внутри вашего запроса. -
Проверить переменную содержит то, что вы ожидаете:
Если вы ожидаете целое число, используйте: ctype_digit — Check for numeric character(s);
$value = (int) $value;
$value = intval($value);
$var = filter_var('0755', FILTER_VALIDATE_INT, $options);
Для использования строк: is_string() — Find whether the type of a variable is string
Используйте Функция фильтра filter_var () - фильтрует переменную с указанным фильтром: $email = filter_var($email, FILTER_SANITIZE_EMAIL);
$newstr = filter_var($str, FILTER_SANITIZE_STRING);
более предопределенные фильтры filter_input () - получает определенную внешнюю переменную по имени и, возможно, ее фильтрует : $search_html = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
preg_match () - выполнить регулярное выражение; Напишите свою собственную функцию проверки.
задан Leo Dabus 6 November 2017 в 05:14
поделиться