2016-10-09 2 views
0

Что вы думаете о наилучшем способе дезинфекции массива ниже? Я думал добавлять htmlentites перед каждой строкой $ или, возможно, используя метод ниже.Санизировать массив до эха PHP

<?php 
$result = $conn->query("SELECT formula.id, tokens, direction, graph, module FROM formula INNER JOIN syntics ON formula.moduleid = syntics.id"); 

while ($row = $result->fetch_array()) 
filter_var_array($row, FILTER_SANITIZE_SPECIAL_CHARS); // OK? 

echo     "<td>". 
    $row['tokens'] ."<td>". 
    $row['direction'] ."<td>". 
    $row['graph']  ."<td>". 
    $row['module '] ."<td>". 
    "<a href='upong.php?soya=" . $row['id'] . "'>Specific type</a>" . "</tr>"; 
?> 
+0

Это важно, каковы ваши данные. Являются ли первые 4 поля сохранены как текст или html? Можно ли считать id целым? – Phil

+0

Первые 4 поля сохраняются как html. Вы правы, идентификатор целочисленный. – Global

+1

Ваш вывод из базы данных, что, по-вашему, вам нужно для «Sanitize»? – nogad

ответ

2

Я чувствую, что вы можете получить какую-то общую информацию о предмете санитарии и ухода.

  • Чтобы понять, как написать защищенный PHP-код, вам необходимо предотвратить против XSS.
  • Для предотвращения использования XSS необходимо, чтобы реализовал надлежащее выходное экранирование и, возможно, потребуется внедрить санацию данных.
  • Для обеспечения безопасности данных и вывода данных вы должны понять, почему это проблема и как это сделать должным образом.

Санитарная

Санитарная должно быть сделано перед сохранением данных в базу данных. Он гарантирует, что вещи, которые не должны быть сохранены в базе данных, не являются. Также полезно сделать это снова после того, как вы прочитали данные из своей базы данных, если вы что-то упустили, и ваша база данных теперь содержит что-то вредное. Как правило, если вы просто сохраняете текст, вы можете разрешить сохранение любого текста, и в этом случае санация не нужна. Но похоже, что вы храните html ...

Если вы храните html, вы, вероятно, планируете вывести его в браузеры в какой-то момент, и вы не хотите, чтобы он содержал вредоносные скрипты для ваших пользователей. Sanitizing html для удаления вредоносного javascript на самом деле очень сложно из-за многих способов вставки javascript. Для этого были написаны целые библиотеки PHP (например, wp_kses_*), и этого недостаточно, чтобы просто удалить все теги сценариев <, как предлагают некоторые ответы SO. Кроме того, вам нужно будет обновить код html sanitization, чтобы предотвратить самые новые атаки. В целом, это очень высокий риск/техническое решение. Если вы хотите пройти этот маршрут, есть некоторые решения here.

Обычно вы хотите дать своим пользователям возможность форматировать текст с помощью подмножества того, что предлагает html (например, жирный шрифт, курсив, подчеркивание и, возможно, некоторые цвета), а лучший подход - использовать более легкий язык, такой как Markdown или BBCode

Также вы должны сохранить свои поля только как текст и полностью обработать стиль в своем приложении.

Выход Экранирование

Это шаг вправо перед выводом данных. Когда вы собираете HTML-код для вывода в PHP, вам нужно преобразовать все, что еще не html, в безопасный html. Если вы используете язык шаблонов, это автоматически обрабатывается автоматически. По-моему, это самая непонятная концепция разработчиков PHP сегодня, и, к сожалению, она является одной из самых важных.Я не буду здесь, но я очень рекомендую this further reading.

Важное обновление

Этот код НЕ санитарную данные, то маскирование.

filter_var_array($row, FILTER_SANITIZE_SPECIAL_CHARS); 

теперь я вижу, что смутно, слово «Фильтр» имеет такой общий смысл этого ответа и может, возможно, относятся к как обеззараживание и убежать. Я удалил его из своего ответа, чтобы помочь устранить любую путаницу.

Ваш пример - Санитарная

Я не пойду так далеко, чтобы сказать, никогда не хранить HTML в поле базы данных, но это намного сложнее, таким образом. Вам нужно решить, что ожидается и действительно. Если вы уточните свой вопрос с более подробной информацией о конкретных данных, станет ясно, какими должны быть эти ограничения.

Ваш пример - выход спасаясь

Если переменные уже содержат хорошо сформированы строки фрагмента HTML, то вы можете смело добавлять переменные, используя «» (оператор конкатенации строк) внутри открытого и закрытого тега. То, что вы поставили в своем вопросительном коде, является правильным. Тем не менее, я предпочитаю использовать прямой вывод с короткими тегами, поскольку он делает код более удобочитаемым, и в любом случае нет необходимости вставлять все в строку PHP.

<td><?= $row['tokens'] ?></td> 
<td><?= $row['direction'] ?></td> 
<td><?= $row['graph'] ?></td> 
<td><?= $row['module'] ?></td> 

Примечание: Как описано выше, путем вывода HTML вы просите клиентов доверять, анализировать и отображать его. Если эти переменные действительно содержат неверный или плохой HTML, то это проблема с вашей санитацией.

  • Выходной выход должен/НЕ очищать ваши данные.
  • Санитария должна/НЕ удалять ваши данные.

Это просто две разные концепции, работающие вместе.

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

<a href='upong.php?soya=<?= (int)$row['id'] ?>Specific type</a> 

Если значение не колдовать до целого (потому что произошло нечто неожиданное, которое вы не учитывали), вы в конечном итоге с 0 в вашем URL, который обычно является не то, что вредно.

+0

Большое спасибо за ваше разъяснение. Это действительно очень интересный предмет, и я продолжу читать ссылки. Данные сохраняются из echo => $ _POST => filter_input => query => db. Затем выведите db => query => echo. Так что я должен использовать htmlentites/specialchar для каждой строки, чтобы минимизировать XSS, , как в htmlentities ($ row ['tokens']) htmlentities ($ row ['direction'] и т. Д. – Global

+0

Это зависит от того, какие данные и в каком контексте вы выводите. Из ваших комментариев вы говорите, что 4 поля являются html, а не текстовыми, и поскольку вы вставляете их между тегами «», ваш контекст также является html. Поэтому в этой ситуации вам не нужно ничего избегать (i Если вы сохранили html в своей базе данных, вы должны убедиться, что он очищен и дезинфицирует его еще до вывода. – Phil

+0

I Теперь все потеряно. Данные хранятся с пользовательского ввода в виде POST, затем дезинфицируются и вставляют запрос в db. Результат объявляется в моем первом сообщении. И если вы правильно поняли, мне нужно санировать w дырочная решетка прямо перед эхом? Каким образом было бы наиболее последовательным ввести его? – Global

-1

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

-1

Если вы беспокоитесь о нападении XSS, то вы действительно должны заботиться о проблеме до ввода вставляется в базу данных с помощью htmlentities() на нем. Никогда не доверяйте пользовательскому вводу.

+0

Я настоятельно рекомендую ** никогда не использовать htmlentities ** для данных ** до **, это сохраняется. Существует разница между санированием и экранированием, и нехорошо считать формат вывода всегда html. – Phil

Смежные вопросы