Да, MySQL може да съхранява всеки тип текст технически безопасно. Което означава, че MySQL ще запази текста такъв, какъвто е, и ще го върне отново, без да губи никакви данни.
Mysql не се различава между съдържанието на текста, така че няма разлика дали това е HTML, CSS, JS код или последния имейл на вашите приятели.
Ако обаче изведете текста по-късно, трябва да се погрижите да няма нежелано инжектиране на код, след като сте изтеглили данните от mysql. Но това всъщност не е свързано с MySQL.
За да направите sql по-сигурен, предайте манипулатора на базата данни на mysql_real_escape_string
или дори по-добре използвайте MySQLi
и/или PDO
и изготвени изявления.
Вашият код
Кодът ви изглежда, че се опитвате много да предотвратите нещо, но в крайна сметка се оказва доста безполезен:
function filter($data) {
$data = trim(htmlentities(strip_tags($data)));
if (get_magic_quotes_gpc())
$data = stripslashes($data);
$data= strip_tags($data);
$data = mysql_real_escape_string($data);
return $data;}
Нормализирайте данните, преди да ги обработите
Преди всичко трябва да промените позицията на проверката за get_magic_quotes_gpc
за нормализиране на данните, върху които работи функцията. Би било още по-добре, ако приложението ви не разчита на него, а просто отказва да работи, ако тази опция е активирана - вижте тази важна информация тук за това
ако ви е грижа за сигурността.
Но за безопасността на публикувания ви код, нека първо нормализираме входната стойност на функцията, преди да я обработваме допълнително. Това става чрез преместване на отметката в горната част на функцията.
function filter($data)
{
// normalize $data because of get_magic_quotes_gpc
$dataNeedsStripSlashes = get_magic_quotes_gpc();
if ($dataNeedsStripSlashes)
{
$data = stripslashes($data);
}
// normalize $data because of whitespace on beginning and end
$data = trim($data);
// strip tags
$data = strip_tags($data);
// replace characters with their HTML entitites
$data = htmlentities($data);
// mysql escape string
$data = mysql_real_escape_string($data);
return $data;
}
В тази модифицирана функция нещата с магически кавички (които не трябва да използвате) са преместени в горната част на нея. Това гарантира, че независимо дали тази опция е включена или изключена, данните винаги ще се обработват еднакво. Вашата функция не го направи, тя би създала различни резултати за едни и същи предадени данни. Така че това е поправено.
Още проблеми с вашата функция
Дори функцията изглежда по-добре сега, все още има много проблеми. Например, не е ясно какво всъщност прави функцията. Прави много неща наведнъж и някои от тях са противоречиви:
- Премахва HTML тагове, което е знак, че
$data
не трябва да съдържа HTML - Но след това конвертирате текста на
$data
действително да съдържа HTML обекти.
И така, какви трябва да бъдат данните? HTML или не? Той не въвежда повече сигурност, ако нещата станат неясни, защото това ще е от полза, че грешките влизат във вашата програма и в крайна сметка дори преминават вашите предпазни мерки.
Така че трябва просто да изхвърлите кода и да вземете предвид следното:
- Ако въведеното в приложението ви е невалидно, не го филтрирайте. Вместо това предотвратявайте по-нататъшното използване на невалиден вход. Така че имате нужда от функция за валидиране на въведеното, преди да го използвате.
- Не променяйте данните само защото мислите това може да направи нещо по-сигурно. Вместо това променяйте и кодирайте данни, където е необходимо и подходящо.
- Направете приложението си да работи само с изключени магически кавички. Разчитането на тази функция е силно обезкуражено. И тогава няма нужда да проверявате за това във вашия код.
- За да съхранявате нещо безопасно в базата данни, избягвайте данните, преди да ги използвате само в заявката. Не на друго място на вашето приложение. Използвайте подготвени изявления за това.
- Няма нужда да оспорвате данните, преди да ги поставите в базата данни, ако са валидни. Но трябва да го кодирате правилно, когато го извеждате на уеб страницата . И само там едно приложение знае в кое кодиране трябва да бъде това. Вие не знаете това, когато поставите данните в базата данни.
Така че, ако искате да направите кода си по-сигурен, не става въпрос за хвърляне на куп функции върху някои данни, защото смятате, че те са свързани със сигурността. По този начин не правите софтуера си по-сигурен, но по-малко сигурен.
- Никога не се доверявайте на потребителски данни.
- Уверете се, че данните са във формата, от който се нуждаете преди обработка .
- Използвайте правилния инструмент за работата на правилното място.
- Никога не използвайте инструменти при отгатване. Получавайте знания вместо това, което плаща не само от гледна точка на сигурността.