PHP замена кавычек и безопасность

236
17 августа 2018, 06:10

Всем привет! Есть PHP код функции:

function strip_mq_gpc($arg)
{
  if (get_magic_quotes_gpc())
  {
    $arg = str_replace('"',"'",$arg);
    $arg = stripslashes($arg);
    return $arg;
  } 
  else
  {
    $arg = str_replace('"',"'",$arg);
    return $arg;
  }
}

и его использование

$conn = &ADONewConnection($DBTYPE);
$conn->PConnect($DBHOST, $DBUSER, $DBPASSWORD, $DBNAME);
@mysql_query("SET NAMES 'UTF8'");
$sql = "SELECT * from config";
$rsc = $conn->Execute($sql);
if($rsc){while(!$rsc->EOF)
{
$field = $rsc->fields['setting'];
$config[$field] = $rsc->fields['value'];
STemplate::assign($field, strip_mq_gpc($config[$field]));
@$rsc->MoveNext();
}}

в MySQL таблице:

CREATE TABLE IF NOT EXISTS `config` (
  `setting` varchar(60) NOT NULL DEFAULT '',
  `value` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

вопрос: как параметры в определении Smarty assign связаны с кавычками(',") str_replace('"',"'",$arg);? Для чего их надо менять?

Answer 1

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

<meta name="keywords" content="{if $pagetitle ne ""}{$pagetitle},{/if}{if $metakeywords ne ""}{$metakeywords},{/if}{$site_name}" /> 

давайте упростим это немного, т.к. конструкция ne "" смысла не имеет.

<meta name="keywords" content="{if $pagetitle}{$pagetitle},{/if}{if $metakeywords}{$metakeywords},{/if}{$site_name}" /> 

Если опустить тот факт, что в целом meta keywords в современном мире вещь практически игнорируемая поисковиками, вернемся к факту, что слова могут быть как разделены запятыми, так и пробелами. Так что, можно вовсе убрать все эти {if}

<meta name="keywords" content="{$pagetitle} {$metakeywords} {$site_name}" /> 

Дак вот, давайте представим, что поле $site_name содержит значение ООО "Рога и Копыта", а остальные для примера пустые. Что мы получим при простой подстановке:

<meta name="keywords" content="  ООО "Рога и Копыта"" /> 

Что делает нашу разметку некорректной, а часть Рога и Копыта"" стала мусором.

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

  • Заменить эти двойные кавычки, как вы и делали
  • Удалить их вовсе
  • Заменить на html-сущности

Только вот решать это надо прямо там в шаблоне (на примере одной переменной):

<meta name="keywords" content="{$site_name|replace:'"':''}" />
<meta name="keywords" content="{$site_name|escape}" />

Смысла использовать кавычки в ключевых словах нет, так что этот вариант не привожу.

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

<meta name="keywords" content="{"$pagetitle $keywords $site_name"|replace:'"':""|escape}" />

или просто экранируются по отдельности

<meta name="keywords" content="{$pagetitle|escape} {$keywords|escape} {$site_name|escape}" />

всяческие вызовы strip_mq_gpc из кода удаляются за ненужностью.

READ ALSO
Замена %20 в ссылке

Замена %20 в ссылке

Возможно ли в ссылке http://test/phone=%20380999123123 %20 заменить на + и выводить все это в адресную строку?

254
Общий механизм взаимодействия с бд

Общий механизм взаимодействия с бд

Решил написать проект (учебный) на laravelИ так как это известный фреймворк естественно посмотрел как он устроен

192
Вставить символ в переменную php

Вставить символ в переменную php

Каким образом можно подставить знак ; между переменной в php , которая формируется подстановкой из URI:

249