php позволяет запустить javascript-код [duplicate]

Вызов

if (a == b)

Будет работать большую часть времени, но он не всегда будет работать, поэтому не используйте его.

Самый правильный способ сравнения двух целых чисел классы для равенства, считая, что они называются 'a' и 'b', должны вызывать:

if(a != null && a.equals(b)) {
  System.out.println("They are equal");
}

Вы также можете использовать этот способ, который немного быстрее.

   if(a != null && b != null && (a.intValue() == b.intValue())) {
      System.out.println("They are equal");
    } 

На моей машине 99 миллиардов операций заняли 47 секунд, используя первый метод, и 46 секунд, используя второй метод. Вам нужно будет сравнить миллиарды значений, чтобы увидеть разницу.

Обратите внимание, что «a» может быть пустым, поскольку это объект. Сравнение таким образом не приведет к исключению нулевого указателя.

Для сравнения большего и меньшего, используйте

if (a != null && b!=null) {
    int compareValue = a.compareTo(b);
    if (compareValue > 0) {
        System.out.println("a is greater than b");
    } else if (compareValue < 0) {
        System.out.println("b is greater than a");
    } else {
            System.out.println("a and b are equal");
    }
} else {
    System.out.println("a or b is null, cannot compare");
}
201
задан TimTim 3 January 2010 в 21:09
поделиться

9 ответов

<?php
function xss_clean($data)
{
// Fix &entity\n;
$data = str_replace(array('&amp;','&lt;','&gt;'), array('&amp;amp;','&amp;lt;','&amp;gt;'), $data);
$data = preg_replace('/(&#*\w+)[\x00-\x20]+;/u', '$1;', $data);
$data = preg_replace('/(&#x*[0-9A-F]+);*/iu', '$1;', $data);
$data = html_entity_decode($data, ENT_COMPAT, 'UTF-8');

// Remove any attribute starting with "on" or xmlns
$data = preg_replace('#(<[^>]+?[\x00-\x20"\'])(?:on|xmlns)[^>]*+>#iu', '$1>', $data);

// Remove javascript: and vbscript: protocols
$data = preg_replace('#([a-z]*)[\x00-\x20]*=[\x00-\x20]*([`\'"]*)[\x00-\x20]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2nojavascript...', $data);
$data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2novbscript...', $data);
$data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*-moz-binding[\x00-\x20]*:#u', '$1=$2nomozbinding...', $data);

// Only works in IE: <span style="width: expression(alert('Ping!'));"></span>
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?expression[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?behaviour[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#iu', '$1>', $data);

// Remove namespaced elements (we do not need them)
$data = preg_replace('#</*\w+:\w[^>]*+>#i', '', $data);

do
{
    // Remove really unwanted tags
    $old_data = $data;
    $data = preg_replace('#</*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i', '', $data);
}
while ($old_data !== $data);

// we are done...
return $data;
}
4
ответ дан Abdo-Host 25 August 2018 в 04:18
поделиться

Вы также можете установить некоторые заголовки ответов HTTP, связанные с XSS, через header(...)

X-XSS-Protection «1; mode = block»

, убедитесь, что режим защиты браузера XSS включен.

Content-Security-Policy "default-src 'self'; ..."

для обеспечения безопасности на стороне браузера. См. Этот раздел для сведений о политике безопасности контента (CSP): http://content-security-policy.com/ . Особенно рекомендуется настроить CSP для блокировки встроенных скриптов и внешних источников сценариев, что полезно для XSS.

для общей группы полезных заголовков HTTP-ответов, касающихся безопасности вашего webapp, посмотрите на OWASP: https://www.owasp.org/index.php/List_of_useful_HTTP_headers

1
ответ дан chris 25 August 2018 в 04:18
поделиться

Одним из наиболее важных шагов является дезинфекция любого пользовательского ввода до его обработки и / или возврата в браузер. PHP имеет некоторые функции filter ", которые могут быть использованы.

Обычно форма, которую обычно применяют атаки XSS, заключается в том, чтобы вставить ссылку на какой-то внешний сайт javascript, содержащий вредоносные намерения для пользователь. Узнайте больше об этом здесь .

Вы также захотите проверить свой сайт - я могу порекомендовать дополнение Firefox XSS Me .

12
ответ дан James Kolpack 25 August 2018 в 04:18
поделиться
  • 1
    Что мне нужно, чтобы убедиться, что я самостоятельно дезинфицирую вход. Есть ли один конкретный символ / строка, на которую я должен следить? – TimTim 3 January 2010 в 21:14
  • 2
    @TimTim - нет. Весь пользовательский вход должен всегда считаться неотвратимым. – zombat 3 January 2010 в 21:28

Перекрестная проводка это как сводная ссылка из бета-версии SO-документации, которая отключается.

Проблема

Межсайтовый скриптинг является непреднамеренным выполнение удаленного кода веб-клиентом. Любое веб-приложение может оказаться в XSS, если оно принимает входные данные от пользователя и выводит его непосредственно на веб-страницу. Если вход включает HTML или JavaScript, удаленный код может быть выполнен, когда это содержимое отображается веб-клиентом.

Например, если сторонняя сторона содержит файл JavaScript:

// http://example.com/runme.js
document.write("I'm running");

И приложение PHP напрямую выводит строку, переданную в нее:

<?php
echo '<div>' . $_GET['input'] . '</div>';

Если параметр unchecked GET содержит <script src="http://example.com/runme.js"></script>, то вывод скрипта PHP будет:

<div><script src="http://example.com/runme.js"></script></div>

Идет запуск стороннего JavaScript, и пользователь увидит «Я запущен» на веб-странице.

Решение

Как правило, никогда не доверяйте вводам, поступающим из клиент. Каждое значение GET, POST и cookie может быть вообще чем угодно и поэтому должно быть проверено. При выводе любого из этих значений удалите их, чтобы они не были оценены неожиданным способом.

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

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

Функции фильтра

Функции фильтра PHPs позволяют входным данным для скрипта php быть дезинфицированным или проверенным в многими способами ]. Они полезны при сохранении или выводе на вход клиента.

Кодировка HTML

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

<?php
echo '<div>' . htmlspecialchars($_GET['input']) . '</div>';
// or
echo '<div>' . filter_input(INPUT_GET, 'input', FILTER_SANITIZE_SPECIAL_CHARS) . '</div>';

Вывод:

<div>&lt;script src=&quot;http://example.com/runme.js&quot;&gt;&lt;/script&gt;</div>

Все, что находится внутри тега <div>, будут интерпретироваться not как тег JavaScript браузером, а вместо этого как простой текстовый узел. Пользователь будет безопасно видеть:

<script src="http://example.com/runme.js"></script>

Кодировка URL

При выводе динамически сгенерированного URL PHP предоставляет функцию urlencode для безопасного вывода допустимых URL-адресов. Например, если пользователь может вводить данные, которые становятся частью другого параметра GET:

<?php
$input = urlencode($_GET['input']);
// or
$input = filter_input(INPUT_GET, 'input', FILTER_SANITIZE_URL);
echo '<a href="http://example.com/page?input="' . $input . '">Link</a>';

Любой вредоносный ввод будет преобразован в параметр кодированного URL.

Использование специализированных внешних библиотек или списков OWASP AntiSamy

Иногда вам нужно отправить HTML или другие входы кода. Вам необходимо будет сохранить список авторизованных слов (белый список) и неавторизованный (черный список).

Вы можете загружать стандартные списки, доступные на веб-сайте OWASP AntiSamy . Каждый список подходит для определенного вида взаимодействия (ebay api, tinyMCE и т. Д.). И это с открытым исходным кодом.

Существуют библиотеки, которые могут фильтровать HTML и предотвращать атаки XSS для общего случая и выполнять как минимум, так и списки AntiSamy с очень простым использованием. Например, у вас есть HTML Purifier

4
ответ дан Matt S 25 August 2018 в 04:18
поделиться

В основном вам нужно использовать функцию htmlspecialchars() всякий раз, когда вы хотите вывести что-то в браузер, который поступает с пользовательского ввода.

Правильный способ использования этой функции что-то вроде этого:

echo htmlspecialchars($string, ENT_QUOTES, 'UTF-8');

В Google Code University также есть эти очень образовательные видеоролики в Интернете:

229
ответ дан Quentin 25 August 2018 в 04:18
поделиться
  • 1
    @TimTim: В большинстве случаев, да. Однако, когда вам нужно разрешить ввод в HTML, все становится немного сложнее, и если это так, я рекомендую вам использовать что-то вроде htmlpurifier.org – Alix Axel 3 January 2010 в 21:23
  • 2
    @Alix Axel, так ваш ответ использовать htmlspecialchars или использовать htmlpurifier.org ? – TimTim 3 January 2010 в 21:39
  • 3
    Если вам нужно принять HTML-вход, используйте HTML Purifier, если не использовать htmlspecialchars(). – Alix Axel 3 January 2010 в 21:41
  • 4
    htmlspecialchars или htmlentities? Проверьте здесь stackoverflow.com/questions/46483/… – kiranvj 16 November 2012 в 08:19
  • 5
    В большинстве случаев это правильно, но это не так просто. Вы должны подумать о том, чтобы положить ненадежную строку в HTML, Js, Css и рассмотреть возможность размещения ненадежного HTML в HTML. Посмотрите на это: owasp.org/index.php/… – bronze man 29 May 2014 в 18:43

В порядке предпочтения:

  1. Если вы используете движок шаблонов (например, Twig, Smarty, Blade), убедитесь, что он предлагает контекстно-зависимое экранирование. Я знаю по опыту, что делает Твиг. {{ var|e('html_attr') }}
  2. Если вы хотите разрешить HTML, используйте Очиститель HTML . Даже если вы считаете, что принимаете только Markdown или ReStructuredText, вы все равно хотите очистить HTML эти языки разметки.
  3. В противном случае используйте htmlentities($var, ENT_QUOTES | ENT_HTML5, $charset) и убедитесь, что остальная часть вашего документа использует тот же набор символов, что и $charset. В большинстве случаев 'UTF-8' является желаемым набором символов.

Кроме того, убедитесь, что вы выбрали на выходе, а не на входе .

7
ответ дан Scott Arciszewski 25 August 2018 в 04:18
поделиться

Одна из моих любимых ссылок OWASP - это объяснение кросс-сайта Scripting , потому что, хотя существует большое количество векторов атаки XSS, некоторые из немногих правил могут защитить от большинства из них значительно!

Это PHP Cheat Sheet

35
ответ дан Wahyu Kristianto 25 August 2018 в 04:18
поделиться

Многие фреймворки помогают обрабатывать XSS по-разному. Когда вы катаетесь самостоятельно или если есть какая-то проблема XSS, мы можем использовать filter_input_array (доступно в PHP 5> = 5.2.0, PHP 7.) Обычно я добавляю этот фрагмент к моему SessionController, потому что все вызовы пройдите туда до того, как какой-либо другой контроллер взаимодействует с данными. Таким образом, все входные данные пользователя дезинфицируются в одном центральном месте. Если это сделано в начале проекта или до того, как ваша база данных отравлена, у вас не должно быть никаких проблем во время выхода ... останавливает мусор, мусор.

/* Prevent XSS input */
$_GET   = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);
$_POST  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
/* I prefer not to use $_REQUEST...but for those who do: */
$_REQUEST = (array)$_POST + (array)$_GET + (array)$_REQUEST;

Вышеупомянутое удалит ВСЕ HTML & amp; скриптовые теги. Если вам нужно решение, которое позволяет безопасные метки на основе белого списка, посмотрите HTML Purifier .


Если ваша база данных уже отравлена ​​или вы хотите иметь дело с XSS во время выхода, OWASP рекомендует создать пользовательскую функцию-обертку для echo и использовать ее в любом случае вы выведете пользовательские значения:

//xss mitigation functions
function xssafe($data,$encoding='UTF-8')
{
   return htmlspecialchars($data,ENT_QUOTES | ENT_HTML401,$encoding);
}
function xecho($data)
{
   echo xssafe($data);
}
2
ответ дан webaholik 25 August 2018 в 04:18
поделиться

Используйте htmlspecialchars на PHP. В HTML старайтесь избегать использования:

element.innerHTML = “…”; element.outerHTML = “…”; document.write(…); document.writeln(…);

, где var - , управляемый пользователем .

Также, очевидно, избегайте eval(var), если вам нужно использовать любой из них, тогда попробуйте JS, избегая их, HTML уберет их, и вам, возможно, придется сделать еще кое-что, но для основ этого должно быть достаточно.

0
ответ дан ρяσѕρєя K 25 August 2018 в 04:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: