По общему мнению, в приложении PHP + MySQL вы должны:
- Подтвердить введенные данные (например, электронные письма должны быть отформатированы как электронные) (например, с помощью filter_var)
- Добавить / обновить / прочитать / удалить ваши данные, избегая SQL внедрения (например, используя класс PDO)
- выход из выходного файла
Этот вопрос касается последней части
Я хотел бы создать простую, унифицированную 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 есть что-то, что может вызвать проблемы, которые я не рассматривал?
- Есть ли лучший способ сделать все это?