Mysql
 sql >> база данни >  >> RDS >> Mysql

Кой е най-сигурният начин да добавите html/css/js към mysql?

Да, 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 или не? Той не въвежда повече сигурност, ако нещата станат неясни, защото това ще е от полза, че грешките влизат във вашата програма и в крайна сметка дори преминават вашите предпазни мерки.

Така че трябва просто да изхвърлите кода и да вземете предвид следното:

  • Ако въведеното в приложението ви е невалидно, не го филтрирайте. Вместо това предотвратявайте по-нататъшното използване на невалиден вход. Така че имате нужда от функция за валидиране на въведеното, преди да го използвате.
  • Не променяйте данните само защото мислите това може да направи нещо по-сигурно. Вместо това променяйте и кодирайте данни, където е необходимо и подходящо.
    • Направете приложението си да работи само с изключени магически кавички. Разчитането на тази функция е силно обезкуражено. И тогава няма нужда да проверявате за това във вашия код.
    • За да съхранявате нещо безопасно в базата данни, избягвайте данните, преди да ги използвате само в заявката. Не на друго място на вашето приложение. Използвайте подготвени изявления за това.
    • Няма нужда да оспорвате данните, преди да ги поставите в базата данни, ако са валидни. Но трябва да го кодирате правилно, когато го извеждате на уеб страницата . И само там едно приложение знае в кое кодиране трябва да бъде това. Вие не знаете това, когато поставите данните в базата данни.

Така че, ако искате да направите кода си по-сигурен, не става въпрос за хвърляне на куп функции върху някои данни, защото смятате, че те са свързани със сигурността. По този начин не правите софтуера си по-сигурен, но по-малко сигурен.

  1. Никога не се доверявайте на потребителски данни.
  2. Уверете се, че данните са във формата, от който се нуждаете преди обработка .
  3. Използвайте правилния инструмент за работата на правилното място.
  4. Никога не използвайте инструменти при отгатване. Получавайте знания вместо това, което плаща не само от гледна точка на сигурността.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Производителност на MySQL Insert изрази в Java:Подготвени оператори в пакетен режим срещу единично вмъкване с множество стойности

  2. използване на виртуални полета за сумиране на стойности в cakephp

  3. MYSQLI::prepare() , грешка при използване на заместител :something

  4. mysql:Как мога да премахна символ в началото или в края на полето

  5. MYSQL INNER JOIN с възможни празни полета