Я использую $_POST и знаю о mysql exploit, я решил использовать эту функцию в верхней части моей страницы, поэтому все POST будут в безопасности: Можете ли вы сказать мне, если я что-то пропущу, и эта функция действительно будет работать, как я думаю?
function clean_post(){
if ( $_POST){
foreach ($_POST as $k => $v) {
$_POST[$k]=stripslashes($v);
$_POST[$k]=mysql_real_escape_string($v);
$_POST[$k]=preg_replace('/<.*>/', "", "$v");
}
}
if ( $_COOKIE){
foreach ($_COOKIE as $k => $v) {
$_COOKIE[$k]=stripslashes($v);
$_COOKIE[$k]=mysql_real_escape_string($v);
$_COOKIE[$k]=preg_replace('/<.*>/', "", "$v");
}
}
}
Он также удалит все теги html, самый безопасный вариант для вывода результата может быть использован:
<pre>
$foo
</pre>
Ура!
Ура!
Я думаю, что это плохая идея. Это повредит данные, введенные вами пользователями, даже до того, как они попадут в базу данных. Этот подход также поможет вам использовать ленивое кодирование, где вы последовательно не избегаете данных, потому что считаете, что все ваши данные уже "чисты". Это вернется, чтобы укусить вас когда-нибудь, когда вам нужно вывести некоторые небезопасные символы, и вы либо забудете их избежать, либо не уверены, какую функцию вам нужно вызывать, чтобы просто попробовать что-то и надеяться, что это сработает.
Чтобы сделать это правильно, вы должны убедиться, что магические кавычки отключены и при необходимости избегают данных, используя точно правильный метод экранирования - не более, не менее.
Есть некоторые проблемы с этим.
Сначала вы применяете функции к типам, которые им не нужны, для целых чисел, например, требуется только (int), чтобы быть безопасным.
Во-вторых, вы не гарантируете длину, когда вы запрашиваете строку "12 символов", было бы неплохо обеспечить, чтобы у вас было всего 12 символов, а не 2048. Ограничение размера - это действительно то, что ваши нападающие не будут как.
Третий в вашем цикле foreach у вас есть переменная $v, вы назначаете 3 раза функцию на $v до $_POST [$ k]. Таким образом, первые два задания теряются, когда происходит 3-го...
Тогда все, что говорили предыдущие люди, правы: -)
Правило применяет фильтр в нужный момент для правильного вывода. Для вывода HTML нужен html-фильтр (htmlspecialchars), но база данных ему не нужна, ему нужна база данных. Предположим, вы хотите извлечь данные из своей базы данных для создания CSV или PDF файлов, а экранирование HTML сделает вашу жизнь более сложной. В это время вам понадобится экранирование CSV или выпадение PDF файла.
Наконец, очень сложно запомнить, если вы манипулируете данными, которые уже хорошо экранированы для вашего вывода. И я рекомендую вам отличное чтение на Joel on Software о Apps Hungarian. Текст довольно длинный, но очень хороший, и последовательность веб-экранирования используется в качестве примера того, почему Apps Hungarian является хорошим (даже если System Hungarain - это плохо).
Привет, это мой первый ответ на любой вопрос, заданный в Интернете, поэтому ознакомьтесь с ним.
Поместите этот код в верхнюю часть вашего script и не нужно присваивать эти опубликованные значения любым переменным для выполнения той же самой задачи, что и входные данные для базы данных. Просто используйте значения $_POST, как и в ваших запросах.
foreach ($_POST as $k => $v) {
if(!is_array($_POST[$k]) ) { //checks for a checkbox array & so if present do not escape it to protect data from being corrupted.
if (ini_get('magic_quotes_gpc')) {
$v = stripslashes($v);
}
$v = preg_replace('/<.*>/', "", "$v"); //replaces html chars
$_POST[$k]= mysql_real_escape_string(trim($v));
}
}
Я не знаю, правильна ли ваша функция или нет, но принцип, безусловно, неверен. Вы хотите убежать только там, где вам нужно, то есть перед тем, как передавать вещи в MySQL (на самом деле вы даже не хотите этого делать, в идеале, используйте связанные параметры).
Существует множество ситуаций, когда вы можете захотеть, чтобы необработанные данные передавались по HTTP-запросу. С вашим подходом нет возможности сделать это.
В общем, я не думаю, что это хорошая идея.
mysql_*
устарели.strip_tags
или htmlspecilchars
.stripslashes
требуется только в том случае, если включены магические кавычки (чего они не должны быть, но всегда возможны)При работе с stripslashes я бы использовал get_magic_quotes_gpc()
:
if (get_magic_quotes_gpc()) {
$_POST[$k]=stripslashes($v);
}
В противном случае вы будете перекрывать.
Не забывайте $_GET []
if ($_POST OR $_GET)
Также вы можете добавить strip_tags()
get_magic_quotes_gpc()
используяget_magic_quotes_gpc()
. Что делать, если вы случайно вызвали функцию дважды?