Source for file jFilter.class.php

Documentation is available at jFilter.class.php

  1. <?php
  2. /**
  3. @package     jelix
  4. @subpackage  utils
  5. @author      Laurent Jouanneau
  6. @contributor Julien Issler
  7. @copyright   2006-2012 Laurent Jouanneau
  8. @copyright   2008 Julien Issler
  9. @link        http://www.jelix.org
  10. @licence     http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public Licence, see LICENCE file
  11. */
  12.  
  13. /**
  14.  * utility class to check values
  15.  * @package     jelix
  16.  * @subpackage  utils
  17.  * @since 1.0b1
  18.  */
  19. class jFilter {
  20.  
  21.     private function _construct({}
  22.  
  23.     static public function usePhpFilter(){
  24.         return true;
  25.     }
  26.  
  27.     /**
  28.      * check if the given value is an integer
  29.      * @param string $val the value
  30.      * @param int $min minimum value (optional), null if no minimum
  31.      * @param int $max maximum value (optional), null if no maximum
  32.      * @return boolean true if it is valid
  33.      */
  34.     static public function isInt ($val$min=null$max=null){
  35.         // @FIXME no doc on the way to use min/max on filters
  36.         if(filter_var($valFILTER_VALIDATE_INT=== falsereturn false;
  37.         if($min !== null && intval($val$minreturn false;
  38.         if($max !== null && intval($val$maxreturn false;
  39.         return true;
  40.     }
  41.  
  42.     /**
  43.      * check if the given value is an hexadecimal integer
  44.      * @param string $val the value
  45.      * @param int $min minimum value (optional), null if no minimum
  46.      * @param int $max maximum value (optional), null if no maximum
  47.      * @return boolean true if it is valid
  48.      */
  49.     static public function isHexInt ($val$min=null$max=null){
  50.         // @FIXME no doc on the way to use min/max on filters
  51.         if(filter_var($valFILTER_VALIDATE_INTFILTER_FLAG_ALLOW_HEX=== falsereturn false;
  52.         if($min !== null && intval($val,16$minreturn false;
  53.         if($max !== null && intval($val,16$maxreturn false;
  54.         return true;
  55.     }
  56.  
  57.  
  58.      /**
  59.      * check if the given value is a boolean
  60.      * @param string $val the value
  61.      * @return boolean true if it is valid
  62.      */
  63.     static public function isBool ($val){
  64.         // we don't use filter_var because it return false when a boolean is "false" or "FALSE" etc..
  65.         //return filter_var($val, FILTER_VALIDATE_BOOLEAN);
  66.         return in_array($valarray('true','false','1','0','TRUE''FALSE','on','off'));
  67.     }
  68.  
  69.  
  70.     /**
  71.      * check if the given value is a float
  72.      * @param string $val the value
  73.      * @param int $min minimum value (optional), null if no minimum
  74.      * @param int $max maximum value (optional), null if no maximum
  75.      * @return boolean true if it is valid
  76.      */
  77.     static public function isFloat ($val$min=null$max=null){
  78.         // @FIXME no doc on the way to use min/max on filters
  79.         if(filter_var($valFILTER_VALIDATE_FLOAT=== falsereturn false;
  80.         if($min !== null && floatval($val$minreturn false;
  81.         if($max !== null && floatval($val$maxreturn false;
  82.         return true;
  83.     }
  84.  
  85.     /**
  86.      * check if the given value is
  87.      * @param string $url the url
  88.      * @return boolean true if it is valid
  89.      */
  90.  
  91.     static public function isUrl ($url$schemeRequired=false,
  92.                             $hostRequired=false$pathRequired=false,
  93.                             $queryRequired=false ){
  94.         /*
  95.          FIXME php 5.3
  96.          because of a bug in filter_var (error when no scheme even if there isn't
  97.          FILTER_FLAG_SCHEME_REQUIRED flag), we don't use filter_var here
  98.         $flag=0;
  99.         if($schemeRequired) $flag |= FILTER_FLAG_SCHEME_REQUIRED;
  100.         if($hostRequired) $flag |= FILTER_FLAG_HOST_REQUIRED;
  101.         if($pathRequired) $flag |= FILTER_FLAG_PATH_REQUIRED;
  102.         if($queryRequired) $flag |= FILTER_FLAG_QUERY_REQUIRED;
  103.         return filter_var($url, FILTER_VALIDATE_URL, $flag);
  104.         */
  105.         // php filter use in fact parse_url, so we use the same function to have same result.
  106.         // however, note that it doesn't validate all bad url...
  107.         $res @parse_url($url);
  108.         if($res === falsereturn false;
  109.         if($schemeRequired && !isset($res['scheme'])) return false;
  110.         if($hostRequired && !isset($res['host'])) return false;
  111.         if($pathRequired && !isset($res['path'])) return false;
  112.         if($queryRequired && !isset($res['query'])) return false;
  113.         return true;
  114.     }
  115.  
  116.     /**
  117.      * check if the given value is an IP version 4
  118.      * @param string $val the value
  119.      * @return boolean true if it is valid
  120.      */
  121.     static public function isIPv4 ($val){
  122.         return filter_var($valFILTER_VALIDATE_IPFILTER_FLAG_IPV4!== false;
  123.     }
  124.  
  125.     /**
  126.      * check if the given value is an IP version 6
  127.      * @param string $val the value
  128.      * @return boolean true if it is valid
  129.      */
  130.     static public function isIPv6 ($val){
  131.         return filter_var($valFILTER_VALIDATE_IPFILTER_FLAG_IPV6!== false;
  132.     }
  133.  
  134.     /**
  135.      * check if the given value is an email
  136.      * @param string $val the value
  137.      * @return boolean true if it is valid
  138.      */
  139.     static public function isEmail ($val){
  140.         return filter_var($valFILTER_VALIDATE_EMAIL!== false;
  141.     }
  142.  
  143.     const INVALID_HTML 1;
  144.     const BAD_SAVE_HTML 2;
  145.  
  146.     /**
  147.      * remove all javascript things in a html content
  148.      * The html content should be a subtree of a body tag, not a whole document
  149.      * @param string $html html content
  150.      * @return string  the cleaned html content
  151.      * @since 1.1
  152.      */
  153.     static public function cleanHtml($html$isXhtml false{
  154.         $charset jApp::config()->charset;
  155.         $doc new DOMDocument('1.0',$charset);
  156.         $foot '</body></html>';
  157.  
  158.         if (strpos($html"\r"!== false{
  159.             $html str_replace("\r\n""\n"$html)// removed \r
  160.             $html str_replace("\r""\n"$html)// removed standalone \r
  161.         }
  162.  
  163.         /*if($isXhtml) {
  164.             $head = '<?xml version="1.0" encoding=""?>
  165. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  166. <html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset='.$charset.'"/><title></title></head><body>';
  167.             if(!$doc->loadXML($head.$html.$foot)) {
  168.                 return 1;
  169.             }
  170.         }else{*/
  171.             $head '<html><head><meta http-equiv="Content-Type" content="text/html; charset='.$charset.'"/><title></title></head><body>';
  172.             if(!@$doc->loadHTML($head.$html.$foot)) {
  173.                 return jFilter::INVALID_HTML;
  174.             }
  175.         //}
  176.  
  177.         $items $doc->getElementsByTagName('script');
  178.         foreach ($items as $item{
  179.             $item->parentNode->removeChild($item);
  180.         }
  181.         $items $doc->getElementsByTagName('applet');
  182.         foreach ($items as $item{
  183.             $item->parentNode->removeChild($item);
  184.         }
  185.         $items $doc->getElementsByTagName('base');
  186.         foreach ($items as $item{
  187.             $item->parentNode->removeChild($item);
  188.         }
  189.         $items $doc->getElementsByTagName('basefont');
  190.         foreach ($items as $item{
  191.             $item->parentNode->removeChild($item);
  192.         }
  193.         $items $doc->getElementsByTagName('frame');
  194.         foreach ($items as $item{
  195.             $item->parentNode->removeChild($item);
  196.         }
  197.         $items $doc->getElementsByTagName('frameset');
  198.         foreach ($items as $item{
  199.             $item->parentNode->removeChild($item);
  200.         }
  201.         $items $doc->getElementsByTagName('noframes');
  202.         foreach ($items as $item{
  203.             $item->parentNode->removeChild($item);
  204.         }
  205.         $items $doc->getElementsByTagName('isindex');
  206.         foreach ($items as $item{
  207.             $item->parentNode->removeChild($item);
  208.         }
  209.         $items $doc->getElementsByTagName('iframe');
  210.         foreach ($items as $item{
  211.             $item->parentNode->removeChild($item);
  212.         }
  213.         $items $doc->getElementsByTagName('noscript');
  214.         foreach ($items as $item{
  215.             $item->parentNode->removeChild($item);
  216.         }
  217.         self::cleanAttr($doc->getElementsByTagName('body')->item(0));
  218.         $doc->formatOutput true;
  219.         if ($isXhtml{
  220.           $result $doc->saveXML();
  221.         }
  222.         else {
  223.           $result $doc->saveHTML();          
  224.         }
  225.         if(!preg_match('!<body>(.*)</body>!smU'$result$m))
  226.             return jFilter::BAD_SAVE_HTML;
  227.         return $m[1];
  228.     }
  229.  
  230.     static protected function cleanAttr($node{
  231.         $child=$node->firstChild;
  232.         while($child{
  233.             if($child->nodeType == XML_ELEMENT_NODE{
  234.                 $attrs $child->attributes;
  235.                 foreach($attrs as $attr{
  236.                     if(strtolower(substr($attr->localName,0,2)) == 'on')
  237.                         $child->removeAttributeNode($attr);
  238.                     else if(strtolower($attr->localName== 'href'{
  239.                         if(preg_match("/^([a-z\-]+)\:.*/i",trim($attr->nodeValue)$m)) {
  240.                             if(!preg_match('/^http|https|mailto|ftp|irc|about|news/i'$m[1]))
  241.                                 $child->removeAttributeNode($attr);
  242.                         }
  243.                     }
  244.                 }
  245.                 self::cleanAttr($child);
  246.             }
  247.             $child $child->nextSibling;
  248.         }
  249.     }
  250. }

Documentation generated on Mon, 26 Oct 2015 21:53:34 +0100 by phpDocumentor 1.4.3