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-2009 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 pas de doc sur la façon d'utiliser les min/max sur les 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 pas de doc sur la façon d'utiliser les min/max sur les 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 pas de doc sur la façon d'utiliser les min/max sur les 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.         /* because of a bug in filter_var (error when no scheme even if there isn't
  95.          FILTER_FLAG_SCHEME_REQUIRED flag), we don't use filter_var here
  96.         $flag=0;
  97.         if($schemeRequired) $flag |= FILTER_FLAG_SCHEME_REQUIRED;
  98.         if($hostRequired) $flag |= FILTER_FLAG_HOST_REQUIRED;
  99.         if($pathRequired) $flag |= FILTER_FLAG_PATH_REQUIRED;
  100.         if($queryRequired) $flag |= FILTER_FLAG_QUERY_REQUIRED;
  101.         return filter_var($url, FILTER_VALIDATE_URL, $flag);
  102.         */
  103.         // php filter use in fact parse_url, so we use the same function to have same result.
  104.         // however, note that it doesn't validate all bad url...
  105.         $res=@parse_url($url);
  106.         if($res === falsereturn false;
  107.         if($schemeRequired && !isset($res['scheme'])) return false;
  108.         if($hostRequired && !isset($res['host'])) return false;
  109.         if($pathRequired && !isset($res['path'])) return false;
  110.         if($queryRequired && !isset($res['query'])) return false;
  111.         return true;
  112.     }
  113.  
  114.     /**
  115.      * check if the given value is an IP version 4
  116.      * @param string $val the value
  117.      * @return boolean true if it is valid
  118.      */
  119.     static public function isIPv4 ($val){
  120.         return filter_var($valFILTER_VALIDATE_IPFILTER_FLAG_IPV4!== false;
  121.     }
  122.  
  123.     /**
  124.      * check if the given value is an IP version 6
  125.      * @param string $val the value
  126.      * @return boolean true if it is valid
  127.      */
  128.     static public function isIPv6 ($val){
  129.         return filter_var($valFILTER_VALIDATE_IPFILTER_FLAG_IPV6!== false;
  130.     }
  131.  
  132.     /**
  133.      * check if the given value is an email
  134.      * @param string $val the value
  135.      * @return boolean true if it is valid
  136.      */
  137.     static public function isEmail ($val){
  138.         return filter_var($valFILTER_VALIDATE_EMAIL!== false;
  139.     }
  140.  
  141.     const INVALID_HTML 1;
  142.     const BAD_SAVE_HTML 2;
  143.  
  144.     /**
  145.      * remove all javascript things in a html content
  146.      * The html content should be a subtree of a body tag, not a whole document
  147.      * @param string $html html content
  148.      * @return string  the cleaned html content
  149.      * @since 1.1
  150.      */
  151.     static public function cleanHtml($html$isXhtml false{
  152.         global $gJConfig;
  153.         $doc new DOMDocument('1.0',$gJConfig->charset);
  154.         $foot '</body></html>';
  155.  
  156.         if (strpos($html"\r"!== false{
  157.             $html str_replace("\r\n""\n"$html)// removed \r
  158.             $html str_replace("\r""\n"$html)// removed standalone \r
  159.         }
  160.  
  161.         /*if($isXhtml) {
  162.             $head = '<?xml version="1.0" encoding=""?>
  163. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  164. <html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset='.$gJConfig->charset.'"/><title></title></head><body>';
  165.             if(!$doc->loadXML($head.$html.$foot)) {
  166.                 return 1;
  167.             }
  168.         }else{*/
  169.             $head '<html><head><meta http-equiv="Content-Type" content="text/html; charset='.$gJConfig->charset.'"/><title></title></head><body>';
  170.             if(!@$doc->loadHTML($head.$html.$foot)) {
  171.                 return jFilter::INVALID_HTML;
  172.             }
  173.         //}
  174.  
  175.         $items $doc->getElementsByTagName('script');
  176.         foreach ($items as $item{
  177.             $item->parentNode->removeChild($item);
  178.         }
  179.         $items $doc->getElementsByTagName('applet');
  180.         foreach ($items as $item{
  181.             $item->parentNode->removeChild($item);
  182.         }
  183.         $items $doc->getElementsByTagName('base');
  184.         foreach ($items as $item{
  185.             $item->parentNode->removeChild($item);
  186.         }
  187.         $items $doc->getElementsByTagName('basefont');
  188.         foreach ($items as $item{
  189.             $item->parentNode->removeChild($item);
  190.         }
  191.         $items $doc->getElementsByTagName('frame');
  192.         foreach ($items as $item{
  193.             $item->parentNode->removeChild($item);
  194.         }
  195.         $items $doc->getElementsByTagName('frameset');
  196.         foreach ($items as $item{
  197.             $item->parentNode->removeChild($item);
  198.         }
  199.         $items $doc->getElementsByTagName('noframes');
  200.         foreach ($items as $item{
  201.             $item->parentNode->removeChild($item);
  202.         }
  203.         $items $doc->getElementsByTagName('isindex');
  204.         foreach ($items as $item{
  205.             $item->parentNode->removeChild($item);
  206.         }
  207.         $items $doc->getElementsByTagName('iframe');
  208.         foreach ($items as $item{
  209.             $item->parentNode->removeChild($item);
  210.         }
  211.         $items $doc->getElementsByTagName('noscript');
  212.         foreach ($items as $item{
  213.             $item->parentNode->removeChild($item);
  214.         }
  215.         self::cleanAttr($doc->getElementsByTagName('body')->item(0));
  216.         $doc->formatOutput true;
  217.         if ($isXhtml{
  218.           $result $doc->saveXML();
  219.         }
  220.         else {
  221.           $result $doc->saveHTML();          
  222.         }
  223.         if(!preg_match('!<body>(.*)</body>!smU'$result$m))
  224.             return jFilter::BAD_SAVE_HTML;
  225.         return $m[1];
  226.     }
  227.  
  228.     static protected function cleanAttr($node{
  229.         $child=$node->firstChild;
  230.         while($child{
  231.             if($child->nodeType == XML_ELEMENT_NODE{
  232.                 $attrs $child->attributes;
  233.                 foreach($attrs as $attr{
  234.                     if(strtolower(substr($attr->localName,0,2)) == 'on')
  235.                         $child->removeAttributeNode($attr);
  236.                     else if(strtolower($attr->localName== 'href'{
  237.                         if(preg_match("/^([a-z\-]+)\:.*/i",trim($attr->nodeValue)$m)) {
  238.                             if(!preg_match('/^http|https|mailto|ftp|irc|about|news/i'$m[1]))
  239.                                 $child->removeAttributeNode($attr);
  240.                         }
  241.                     }
  242.                 }
  243.                 self::cleanAttr($child);
  244.             }
  245.             $child $child->nextSibling;
  246.         }
  247.     }
  248. }

Documentation generated on Thu, 22 Mar 2012 22:15:31 +0100 by phpDocumentor 1.4.3