Я пытаюсь объединить функцию общего назначения, которая будет дезинфицировать входные данные в базу данных 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 для автоматического выхода из символов вместо необходимости использования addslashes()
.
Я правильно использовал addslashes()
и mysql_real_escape_string()
и есть ли что-нибудь еще, что я мог бы добавить для повышения санитарии.
благодаря
htmlentities () не требуется для обеспечения безопасности данных для SQL. Он используется для повторения значений данных для вывода HTML, чтобы избежать уязвимостей XSS. Это также важная проблема безопасности, о которой вы должны помнить, но она не связана с SQL.
addslashes () избыточно с mysql_real_escape_string. Вы получите буквальные обратные косые черты в ваших строках в базе данных.
Не используйте магические кавычки. Эта функция устарела много лет. Не развертывайте PHP-код в среде, где включены магические кавычки. Если он включен, выключите его. Если это размещенная среда, и они не будут отключать магические кавычки, получите нового хостинг-провайдера.
Не используйте ext/mysql
. Он не поддерживает параметры запроса, транзакции или использование OO.
Используйте PDO и сделайте ваши запросы более безопасными, используя подготовленные запросы .
Для получения дополнительной информации о написании безопасного SQL, прочитайте мою презентацию SQL Injection Myths and Fallacies .
Магические кавычки устарели . Выключите их, если сможете :).
Вторая часть 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); }
с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); }
с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); }
худшая часть, которая добавляет косые черты, не дезинфицирует ничего , независимо от того, какая функция была использована.
и он не должен использоваться в средствах любой «санитарии» вообще.
косые черты не «дезинфицируют» данные. Слэши имеют только разделители строк . Таким образом, единственная дезинфекция, о которой вы можете говорить, – это побег и цитата .
В противном случае, если вы не ставите кавычки вокруг «дезинфицированной» строки, у вас вообще не будет никакой защиты.
Использование:
mysql_real_escape_string()
Это предотвратит плохие данные, такие как DROP TABLE;)