Как защитить ввод, который должен быть записан в базу данных?

Допустим, у меня есть Text, это текстовая область POST. В этом поле я должен быть в состоянии поместить все, что я хотел бы написать. Например, XSS, SQL и другие возможные плохие коды. Для разметки я буду использовать BBCode, поэтому я хочу отображать код, не заставляя его работать.
Единственное, чего я, конечно, хочу избежать, так это того, что БД облажается! Есть ли чрезвычайно безопасный способ сделать это?

Шаги, которые я на самом деле делаю:

  1. Укажите Content-Type и Charset Content-Type: text/html; charset=UTF-8

  2. Ограничьте ввод. Ex.: Max 500 characters

  3. Используйте htmlentities() $GoodText = htmlentities($Text, ENT_QUOTES, "UTF-8");

  4. Используйте mysql_real_escape_string() $GoodText = mysql_real_escape_string($GoodText);

  5. Хранить в БД $db->store($User, $GoodText);

Насколько я читал, шаги 3 и 4 совершенно одинаковы, но я хотел бы получить объяснение.

В любом случае, это рабочий метод?
Должен ли я также использовать токены для POST-форм?


person eij    schedule 28.12.2010    source источник


Ответы (2)


Краткий обзор для вас:

  • Используйте токены против подделок межсайтовых запросов.

  • Используйте htmlspecialchars/entities против межсайтовых атак.

  • Используйте mysql_real_escape_string против внедрения SQL.

Для безопасности базы данных вам нужно будет только выйти, используя функцию mysql_real_escape_string.

person Oli    schedule 28.12.2010
comment
Это так просто? Просто mysql_real_escape_string? - person eij; 28.12.2010
comment
@eij: сейчас это легко, пока вы не забудете сделать это позже. - person BlueRaja - Danny Pflughoeft; 28.12.2010
comment
mysql_real_escape_string недостаточно: ilia.ws/archives/ - person David 天宇 Wong; 05.02.2013

Я использую эту функцию, которая в основном объединяет шаги 3 и 4. Он работает с одномерным массивом и строками.

function escape($mixed){
    if(is_array($mixed)){
        foreach($mixed as $m => $value){
            $mixed[$m] = mysql_real_escape_string(htmlspecialchars($value, ENT_QUOTES, "UTF-8"));
        }
    }else{
        $mixed =  mysql_real_escape_string(htmlspecialchars($mixed, ENT_QUOTES, "UTF-8"));
    }
return $mixed;
}
person Dejan Marjanović    schedule 28.12.2010