функция для очистки ввода в базу данных Mysql
Я пытаюсь собрать функцию общего назначения, которая будет дезинфицировать ввод в базу данных Mysql. До сих пор это то, что у меня есть:
function sanitize($input){
if(get_magic_quotes_qpc($input)){
$input = trim($input); // get rid of white space left and right
$input = htmlentities($input); // convert symbols to html entities
return $input;
} else {
$input = htmlentities($input); // convert symbols to html entities
$input = addslashes($input); // server doesn't add slashes, so we will add them to escape ',",,NULL
$input = mysql_real_escape_string($input); // escapes x00, n, r, , ', " and x1a
return $input;
}
}
если бы я понял определение get_magic_quotes_qpc()
. Это установлено сервером php для автоматического escape-символов вместо необходимости использовать addslashes()
.
Я addslashes()
и mysql_real_escape_string()
правильно вместе и есть ли что-нибудь еще, что я мог бы добавить, чтобы увеличить дезинфекцию.
спасибо
5 ответов
htmlentities () не требуется, чтобы сделать данные безопасными для SQL. Он используется при повторении значений данных в вывод HTML, чтобы избежать уязвимостей XSS. Это также важная проблема безопасности, о которой вы должны помнить, но она не связана с SQL.
addslashes () является избыточным с mysql_real_escape_string. Вы получите буквальные обратные косые черты в строках базы данных.
Не используйте магические кавычки. Эта функция была устаревшей в течение многих лет. Не развертывать PHP-код для среды, в которой включены магические кавычки. Если он включен, выключите его. Если это размещенная среда, и они не отключат волшебные цитаты, получите нового хостинг-провайдера.
Не используйте ext/mysql
. Он не поддерживает параметры запроса, транзакции или использование OO.
использовать PDO, и сделать ваши запросы безопаснее с помощью подготовленные запросы.
подробнее о написании безопасного SQL читайте в моей презентации среда SQL Инъекционные мифы и заблуждения.
волшебные кавычки устаревший. Выключите их, если сможете :).
вторая часть addslashes
и mysql_real_escape_String
делает почти то же (подобные) вещи. Просто попробуйте
addslashes( '\')
// and
mysql_real_escape_string( '\')
результат должен быть \
если вы используете
mysql_real_escape_string( addslashes( '\'))
вы должны \
(или '\\'
как строку). Использовать только mysql_real_escape_string
(больше) или addslashes
, но не оба одновременно.
я рекомендую использовать PDO вместо необработанных функций и ручного экранирования.
почему вы хотите применить htmlentities перед сохранением данных в базе данных? Что делать, если вы хотите использовать данные для чего-то другого, чем просто записать его в браузер? Например, для поиска, секционирования данных, использования данных на других языках программирования и т. д...
единственное, что вы действительно хотите применить, это mysql_real_escape_string (или использовать PDO), больше ничего.
Я обычно предпочитаю полностью отменить эффекты магических кавычек, всегда. Магия цитаты просто громоздки для работы и никогда не должны были быть изобретены. Вот фрагмент из руководство по PHP чтобы отменить магические цитаты:
if (get_magic_quotes_gpc()) {
$process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
while (list($key, $val) = each($process)) {
foreach ($val as $k => $v) {
unset($process[$key][$k]);
if (is_array($v)) {
$process[$key][stripslashes($k)] = $v;
$process[] = &$process[$key][stripslashes($k)];
} else {
$process[$key][stripslashes($k)] = stripslashes($v);
}
}
}
unset($process);
}
самое худшее, что добавление косых черт ничего не дезинфицирует, независимо от того, какая функция была использована.
и его вообще не следует использовать в средствах какой бы то ни было "дезинфекции".
косые черты не" дезинфицируют " данные. Слеши не избежать строку разделители только. Таким образом, единственная дезинфекция, о которой вы можете говорить, - это побег и и цитирую.
в противном случае, если вы не будете ставить кавычки вокруг" дезинфицированной " строки, у вас не будет защита вообще.