Процедура удаления ВСЕХ ненужных из входящих строк? - PullRequest
0 голосов
/ 27 февраля 2009

Иногда, когда пользователь копирует и вставляет данные в форму ввода, мы получаем символы, подобные следующим:

не для начальных кавычек и для конечных и т. Д. ...

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

function fnSanitizePost($data) //escapes,strips and trims all members of the post array
{
    if(is_array($data))
    {
    $areturn = array();
    foreach($data as $skey=>$svalue)
    {
      $areturn[$skey] = fnSanitizePost($svalue);
    }
    return $areturn;
  }
  else
    {
      if(!is_numeric($data))
        {
            //with magic quotes on, the input gets escaped twice, which means that we have to strip those slashes. leaving data in your database with slashes in them, is a bad idea
            if(get_magic_quotes_gpc()) //gets current configuration setting of magic quotes
      {
        $data = stripslahes($data);
      }
        $data = pg_escape_string($data); //escapes a string for insertion into the database
        $data = strip_tags($data);  //strips HTML and PHP tags from a string
      }
        $data = trim($data);  //trims whitespace from beginning and end of a string
      return $data;
    }
}

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

Спасибо

- Николай

Ответы [ 4 ]

6 голосов
/ 27 февраля 2009

не для начальных кавычек и для конечных кавычек

Это не мусор, это законные символы «умной цитаты», которые были переданы вам в кодировке UTF-8, но неверно прочитаны как ISO-8859-1.

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

Лучше, если вы сможете управлять им, - чтобы все ваши страницы обслуживались как UTF-8, все ваши отправленные формы поступали как UTF-8, а все содержимое базы данных сохранялось как UTF-8. В идеале ваше приложение должно работать внутренне со всеми символами Unicode, но, к сожалению, PHP как язык не имеет собственных строк Unicode, поэтому обычно бывает, что все ваши строки также содержатся в формате UTF-8, и существует риск случайного усечения Последовательность UTF-8 и получение , если вы не хотите использовать mbstring.

$ data = pg_escape_string ($ data); // экранирует строку для вставки в базу данных

$ data = strip_tags ($ data); // удаляет теги HTML и PHP из строки

Вы не хотите делать это в качестве санитарной меры, входящей в ваше заявление. Сохраняйте все строки в виде простого текста для их обработки, затем pg_escape_string () только при выходе на запрос Postgres и htmlspecialchars () только при выходе на HTML-страницу.

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

Одна вещь, которую вы можете использовать в качестве меры по санации - это удалить все управляющие коды в строках (кроме символов новой строки, \ n, которые вы, возможно, захотите).

$data= preg_replace('/[\x00-\x09\x0B-\x19\x7F]/', '', $data);
3 голосов
/ 27 февраля 2009

Вы хотите проверить Функция PHP utf_decode : Преобразует строку с символами ISO-8859-1, кодированными с UTF-8, в однобайтовый ISO-8859-1. Кажется, вы получаете символы UTF, а база данных не может их обработать.

Другое решение - изменить кодировку базы данных, если это возможно.

1 голос
/ 04 апреля 2009

I Наконец-то придумали процедуру замены этих символов. Он занимал разбор некоторых проблемных строк по одному символу за раз и возвращал восьмеричное значение каждого символа. При этом я узнал, что умные кавычки возвращаются как наборы из 3 восьмеричных значений. Вот процедура, которую я использовал для разбора строки:

$str = "string_with_smart_quote_chars";

$ilen = strlen($str);
$sords = NULL;

echo "$str\n\n";

for($i=0; $i<$ilen; $i++)
{
    $sords .= ord(substr($str, $i, 1))."  ";
}

echo "$sords\n\n";

Вот вызовы str_replace (), чтобы «исправить» строку:

$str = str_replace(chr(226).chr(128).chr(156), '"', $str); // start quote
$str = str_replace(chr(226).chr(128).chr(157), '"', $str); // end quote
$str = str_replace(chr(226).chr(128).chr(153), "'", $str); // for single quote

Я собираюсь продолжить создание массива этих поисков / замен, которые, я уверен, будут продолжать расти с ростом использования этих типов символов.

Я знаю, что есть некоторые стандартные процедуры для их замены, но мне не повезло ни с одним из них на платформе Solaris 10, на которой выполняются мои сценарии.

- Николай

0 голосов
/ 28 февраля 2009

Zend Framework Zend_Filter и Zend_Filter_Input имеет очень хорошие инструменты для этого.

...