Выход в выход в PHP - PullRequest
       54

Выход в выход в PHP

2 голосов
/ 10 апреля 2020

По общему мнению, в приложении PHP + MySQL вы должны:

  1. Подтвердить введенные данные (например, электронные письма должны быть отформатированы как электронные) (например, с помощью filter_var)
  2. Добавить / обновить / прочитать / удалить ваши данные, избегая SQL внедрения (например, используя класс PDO)
  3. выход из выходного файла

Этот вопрос касается последней части

Я хотел бы создать простую, унифицированную PHP функцию, которая определяется следующим образом:

function safe_output($var,$context) { ... }

Контекстом может быть тело HTML, атрибут HTML, URL и т. Д. c.

Вот несколько примеров:

<h2>HTML_BODY test</h2>
<div><?php echo(safe_output($content,'HTML_BODY')); ?></div>

<h2>HTML_BODY test (textarea)</h2>
<textarea><?php echo(safe_output($content,'HTML_BODY')); ?></textarea>

<h2>HTML_ATTR test</h2>
<div data-html_attr="<?php echo(safe_output($content,'HTML_ATTR')); ?>">See source for data tag</div>

<h2>HTML_ATTR test (input)</h2>
<input type="text" value="<?php echo(safe_output($content,'HTML_ATTR')); ?>">

<h2>URL test</h2>
<a href="<?php echo(safe_output($content,'URL')); ?>">Link</a>

<h2>JS VAR test</h2>
<script>x = <?php echo(safe_output($content,'JS_VAR')); ?></script>

Пока у меня есть следующее:

function safe_output($var,$context = 'HTML_BODY') {
    if(! in_array($context,array('HTML_BODY','HTML_ATTR','URL','JS_VAR'))) {  return false;}
    switch($context) {
        case 'HTML_BODY':
        case 'HTML_ATTR':
            return htmlspecialchars($var, ENT_QUOTES, 'UTF-8');
        case 'URL':
            return urlencode($var);
        case 'JS_VAR':
            return json_encode($var);

    }
}

Я основал это на OW ASP XSS Cheatsheet , выбирая детали, относящиеся к моему приложению (например, я не использую пользовательский CSS).

  • Должен ли я использовать htmlentities() для HTML атрибутов (кажется, предложено OW ASP, но я не могу найти практический пример того, почему)
  • Is есть что-то, что может вызвать проблемы, которые я не рассматривал?
  • Есть ли лучший способ сделать все это?
...