Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

modified method checkUrl to match RFC 3986.

  • Loading branch information...
commit 3f59dca76fb5ba64df21fa8795f37c2b10d45f5b 1 parent 62a3cc4
@Gemorroj authored
Showing with 37 additions and 24 deletions.
  1. +37 −24 bbcode.lib.php
View
61 bbcode.lib.php
@@ -1088,34 +1088,47 @@ function get_html($elems = null) {
return $result;
}
- /* Функция преобразует строку URL с целью защиты от javascript-инъекции. */
+ /**
+ * Функция преобразует строку URL в соответствии с RFC 3986
+ * @param string $url
+ * @return string
+ */
function checkUrl($url) {
- if (! $url) { return ''; }
- $protocols = array(
- 'ftp://', 'file://', 'http://', 'https://', 'mailto:', 'svn://',
- '#', '/', '?', './', '../', 'www.'
- );
- $is_http = false;
- foreach ($protocols as $val) {
- if ($val === substr($url, 0, strlen($val))) {
- $is_http = true;
- if ('www.' === $val) {
- $url = 'http://'.$url;
- }
- break;
- }
+ $parse = parse_url($url);
+
+ $out = '';
+ if (isset($parse['scheme'])) {
+ $out .= $parse['scheme'] . '://';
+ }
+ if (isset($parse['user']) && isset($parse['pass'])) {
+ $out .= rawurlencode($parse['user']) . ':' . rawurlencode($parse['pass']) . '@';
+ } else if (isset($parse['user'])) {
+ $out .= rawurlencode($parse['user']) . '@';
+ }
+ if (isset($parse['host'])) {
+ $out .= rawurlencode($parse['host']);
}
- if (! $is_http) { $url = './' . $url; }
- $url = htmlentities($url, ENT_QUOTES);
- $url = str_replace('.', '&#'.ord('.').';', $url);
- $url = str_replace(':', '&#'.ord(':').';', $url);
- $url = str_replace('(', '&#'.ord('(').';', $url);
- $url = str_replace(')', '&#'.ord(')').';', $url);
- return $url;
+ if (isset($parse['port'])) {
+ $out .= ':' . $parse['port'];
+ }
+ if (isset($parse['path'])) {
+ $out .= str_replace('%2F', '/', rawurlencode($parse['path']));
+ }
+ if (isset($parse['query'])) {
+ parse_str($parse['query'], $query);
+ // PHP 5.1.2
+ $out .= '?' . str_replace('+', '%20', http_build_query($query, '', '&'));
+ }
+ if (isset($parse['fragment'])) {
+ $out .= '#' . rawurlencode($parse['fragment']);
+ }
+
+ return $out;
}
- /*
- Функция возвращает текущий UNIX timestamp с микросекундами в формате float
+ /**
+ * Функция возвращает текущий UNIX timestamp с микросекундами в формате float
+ * @return float
*/
function _getmicrotime() {
return microtime(true);
Please sign in to comment.
Something went wrong with that request. Please try again.