Является ли Regex для проверки формы, если я использую следующее? - PullRequest
1 голос
/ 21 сентября 2010

Я знаю, что добавлять его в любом случае не вредно, но мне любопытно ...

Если бы я использовал htmlentities (); с ENT_QUOTES и затем mysql_real_escape_string (); переменную перед вводом в базу данных, затем просто используйте html_entity_decode (); вместе с полосками (); для отображения информации ...

Будет ли это все еще безопасно?

Ответы [ 3 ]

3 голосов
/ 21 сентября 2010

Вам не нужно использовать htmlentities перед сохранением данных в базе данных.На самом деле, потом все будет проще, если вы этого не сделаете.Используйте htmlentities только для строк, когда вы выводите их в выводе HTML (независимо от того, извлекли ли вы строку из базы данных или из какого-либо другого источника).

Вам не нужно применять штрихи к данным после их извлечения избаза данных.В базе данных не хранятся дополнительные экранирующие символы - если только вы не применили двойной экранирующий символ по ошибке.

Вот правильная последовательность:

  1. Получить данные из формы

    $input = $_GET["input"];
    
  2. Применить экранирование один раз .

    $quoted_input = "'" . mysql_real_escape_string($input) . "'";
    
  3. Вставить его в базу данных

    $sql = "INSERT INTO MyTable (column1) VALUES ($quoted_input)";
    $success = mysql_query($sql);
    
  4. Позже извлечь его из базы данных

    $sql = "SELECT column1 FROM MyTable";
    $result = mysql_query($sql);
    $row = mysql_fetch_assoc($result);
    $data = $row["column1"];
    
  5. Применить htmlentities один раз при выводе.

    echo htmlentities($data);
    
1 голос
/ 21 сентября 2010

Возможно, вы сможете ответить на вопрос самостоятельно, если знаете, для чего предназначены эти функции:

  • htmlentities должен заменить специальные символы HTML &, <, > и " и , которые могут быть представлены ссылками на символы сущности .Это используется для кодирования данных, которые можно безопасно выводить в любом контексте HTML (особенно с ENT_QUOTES , чтобы их можно было использовать даже в значениях атрибута, заключенных в одинарные кавычки).Например:

    <textarea><?php echo htmlentities('</textarea>'); ?></textarea>
    
  • mysql_real_escape_string предназначен для замены специальных символов в строке MySQL , в то время какпринимая во внимание кодировку символов соединения (требуется mysql_client_encoding).Это используется для кодирования данных для безопасного использования в строке MySQL.Например:

    $query = 'SELECT "'.mysql_real_escape_string("\n\r\t\v\f\\\"").'"';
    
  • html_entity_decode является обратной функцией к htmlentities и заменяет ссылки на символы HTML (как числовые, так иссылки на символы сущностей).

  • stripslashes удален управляющий символ \.

Если вы просто хотите защитить себя от SQL-инъекций, используйте mysql_real_escape_string для данных, которые используются в запросах MySQL.Вы также можете использовать подготовленные операторы или параметризованный построитель запросов (см. Синтаксис SQL для подготовленных операторов , PDO - Подготовленные операторы и хранимые процедуры , MySQLi :: prepare , etи др.).

0 голосов
/ 21 сентября 2010

Вы спрашиваете, если вам все еще нужно регулярное выражение в качестве проверки формы рядом со всеми этими функциями?

если это то, что вы спрашиваете, то, по моему мнению, да, вы никогда не можете быть в безопасности.Я только что написал класс проверки с функциями, которые очищают код и другие функции с помощью регулярных выражений, когда мне нужен конкретный ввод.

...