mysql - хранить встраиваемые коды (youtube, vimeo и т. д.)

Как лучше всего хранить HTML для встраивания?

единственные способы, о которых я могу думать:

возьмите встроенный html и добавьте <?php echo $var1; ?> туда, где идет идентификатор, затем сохраните его в базе данных и используйте Eval для его выполнения.

or

вставьте странную комбинацию символов, которая будет служить маркером для замены в php идентификаторами.


person Mark    schedule 01.12.2009    source источник
comment
Я слышал eval? Во-первых, это зло, а не eval. А во-вторых, бегите прочь, пока не пришли ниндзя PHP и выследили вас;)   -  person Franz    schedule 01.12.2009
comment
Ага, никогда не следует использовать eval. Это также может доставить вам большие неприятности.   -  person Alfred    schedule 01.12.2009


Ответы (2)


Вариант № 2 намного безопаснее - на всякий случай, если кому-то удастся выполнить атаку SQL-инъекции против вашей БД, он не сможет использовать вашу операцию встраивания для выполнения внедренного PHP на стороне сервера. Лучшее, на что они могли надеяться, - это фишинг или XSS-атака.

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

РЕДАКТИРОВАТЬ: Скелетный код для версии XML

XML

<video>
  <url>http://example.com/video.flv</url>
</video>

XSLT

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" />
  <xsl:template match="video">
    <xsl:element name="embed">
      <xsl:attribute name="src"><xsl:value-of select="url/text()" /></xsl:attribute>
      <xsl:attribute name="width">500</xsl:attribute>
    </xsl:element>
  </xsl:template>
</xsl:transform>

PHP

// assuming the XSLT above is stored in SomeTable.transform, and the above XML has been stored in $xml_text
$xml_doc = new DOMDocument();
$xml_doc->loadXML($xml_text);

$xsl_doc = new DOMDocument();
$xsl_doc->loadXML(GetXSLT("flv"));

$processor = new XSLTProcessor();
$processor->importStyleSheet($xsl_doc);
echo $processor->transformToXML($xml_doc);

function GetXSLT($type)
{
    $db = mysql_connect("user", "password", "host"); // not sure if I got the order right here, but whatever
    $res = mysql_query("SELECT transform FROM SomeTable WHERE type = '$type'"); // should use parameters instead of directly embedding the type here to avoid bugs and exploits, but whatever
    $array = mysql_fetch_assoc($res);
    return $array['transform'];
}

Приятно то, что вы можете создать класс для генерации входного XML, и он может содержать все параметры, которые вы хотите передать вашему тегу <embed>. Если вы не добавите инструкции обработки в свой XSLT для их обработки, они будут игнорироваться. Создайте один класс для генерации базового XML и подкласс для каждого типа мультимедиа, который вы хотите отобразить, и создание XML для передачи преобразований должно быть простым.

person Dathan    schedule 01.12.2009
comment
Не могли бы вы подсказать, как я могу сделать ваш альтернативный вариант XML? или, по крайней мере, назовите меня в правильном направлении :) - person Mark; 02.12.2009
comment
Спасибо за XML-код ... Я понял, что могу сделать первый вариант ... но сохранить их в файловой системе и в каталоге встроенного файла в базе данных ... таким образом, уменьшив нагрузку на базу данных , что упрощает реализацию и снижает вероятность ошибок, чем вариант 2. - person Mark; 02.12.2009

Почему бы просто не сохранить 11-символьный видеокод, а затем создать HTML-код везде, где вы хотите встроить это видео?

См. Это: Как встраивать видео YouTube в PHP?

person Bruno De Barros    schedule 19.02.2011