exakat.1.7.7 Review

exakat 1.7.7带来了两个新分析:inclodode()有一个参数,以及偷偷的安全漏洞。它是用整数的臭名昭着的检查。告诉我Exakat 1.7.7立即审查! 

用一个争论局面

Implode()是PHP本机功能,自上次千年以来一直存在。我很确定它是php-fi甚至php 1.0,虽然我可以’T查找任何证明(尚未)。因此,作为史前遗物,它的表现就像任何功能都会在最后一千年期间行事:奇怪的是。 

尤其是, Implode()只接受一个论点。你可以直接给它打电话,没有任何提及的 $glue,它是插入两个数组之间的字符串’s elements.

<pre class="wp-block-syntaxhighlighter-code"> 
&amp;lt;?php
  $letters = range('a', 'z');

  // Recommended syntax.
  print implode('', $letters);

  // Old and not-recommended behavior.
  print implode($letters);
?&gt;
 </pre>

当胶合省略时,使用空字符串。上面的脚本显示字母表 abcdefghijklmnopqrstuvwxyz

虽然它是,而且,方便,建议在呼叫屏幕时总是提及胶水()。使用空字符串作为胶水与省略它相同的效果,并且更可读。它也与explode()一致,这需要将分隔符作为第一个参数。 

虽然,您还可能会注意到explode()接受第三个参数:返回数组的限制大小。如果参数大,则防止爆炸()爆炸()expect of memind。默认限制是PHP最大限度。 

此外,爆炸()没有’t接受一个空字符串,如分隔符:如果您想要 将字符串拆分为单独的元素,您应该使用str_split()。或者您也可以通过简单地访问字符串中的偏移量来访问这些字符,其中包含数组语法。

<pre class="wp-block-syntaxhighlighter-code">

&amp;lt;?php
  $alphabet = 'abcdefghijklmnopqrstuvwxyz';

  $letters = str_split($alphabet);

  print_r($letters);
?&gt;
 </pre>

注意 str_split()也接受第二个参数,这是结果阵列中元素的长度()。 

<pre class="wp-block-syntaxhighlighter-code"> 
&amp;lt;?php
  $alphabet = 'abcdefghijklmnopqrstuvwxyz';
  $letters = str_split($alphabet, 2);
  print_r($letters);

/*
  Array (     
    [0] =&gt; ab     
    [1] =&gt; cd     
    [2] =&gt; ef     
    [3] =&gt; gh     
    [4] =&gt; ij     
    [5] =&gt; kl     
    [6] =&gt; mn     
    [7] =&gt; op     
    [8] =&gt; qr     
    [9] =&gt; st     
    [10] =&gt; uv     
    [11] =&gt; wx     
    [12] =&gt; yz 
   )
*/  

?&gt;
 </pre>

虽然它似乎是一个非常古老的inclode()使用,但我们设法找到它 莫里奇Openemr.Tikiwiki., 或者 zurmo.

使用整数验证数据

将传入数据与整数进行比较,必须小心处理。特别是,PHP可以自动调整操作数的类型,并验证内容,而实际值保持注射。在下面的代码中看到它在操作中: 

<pre class="wp-block-syntaxhighlighter-code"> 
&amp;lt;?php
  if ($_GET['x'] == 2) {     
    echo $_GET['x'];
  }
?&gt;
 </pre>

这是一个如此短的例子,你可能想知道技巧在哪里。它实际上隐藏在平原的视线中。 

$_GET['x'] 包含字符串,只有字符串(有时,阵列)。与2的比较时,PHP明白它可以’t compare the string '2' with the integer 2,因此它将字符串投入整数,然后比较两个结果。如果铸造值等于整数值,则条件成功。只要 $_GET['x'] is 2 (integer), or '2' 一个简单的字符串,该代码有效。

问题出现了 $_GET['x'] 包含可以转换为整数的字符串,但不是实际整数。例如, $_GET['x'] maybe '2 <hr>' : 

<pre class="wp-block-syntaxhighlighter-code"> 
&amp;lt;?php
  $x = '2 &amp;lt;hr&gt;';
  if ($x == 2) {     
    echo $x;
  }
?&gt;
 </pre>

转换是沉默的,现在注射现在是真实的。这产生了许多安全警告,包括 CMS中键入杂耍验证旁路漏洞使简单

问题会影响与整数的任何比较:条件中使用的值与条件已满足后的操作不同。与此类似的其他情况可能更明确,并且使用 (int) : 

<pre class="wp-block-syntaxhighlighter-code"> 
&amp;lt;?php
  $x = '2 &amp;lt;hr&gt;';
  if ((int) $x == 2) {     
    echo $x;
  }
?&gt;
 </pre>

问题的根源是 (int) $x is not the same as $x,由于类型传递更改变量的内容。 

没有三重等于需要

对此问题的直接解决方案是使用 ===。然后,比较将永远失败 $_GET,由于传入值始终是字符串。这将导致我们在上面描述的显式类型,并且初始问题返回,具有相同的漏洞。

<pre class="wp-block-syntaxhighlighter-code"> 
&amp;lt;?php
  $x = '2 &amp;lt;hr&gt;';
  if ($x === 2) { // always fail, $x is a string     
    echo $x;
  }

  if ((int) $x === 2) { // pass, but raw $x is still infected
    echo $x;
  }
?&gt;
 </pre>

typeInt然后比较

此漏洞中的重要部分是比较和操作该值的整数版本,而不是其原始版本。因此,显式应用于另一个变量,然后使用该变量是正确的解决方案。 

<pre class="wp-block-syntaxhighlighter-code"> 
&amp;lt;?php
  $x = '2 &amp;lt;hr&gt;';
  $validatedX = (int) $x;

  if ($validatedX === 2) {      
    echo $validatedX;
  }

  if ($validatedX == 2) {      
    echo 2;   
  }
?&gt;
 </pre>

作为侧面笔记,并通过操作此简单脚本,使用比较的字面意思而不是原始注入的值来解决问题:此解决方案还避免使用脚本输出中的传入数据。 

exakat.现在报告使用PHP SuperGlobals与整数的比较:这是大多数问题的根源。我们’LL与其他数据源进行实验,并查看我们如何跟踪更多这些问题:这应该是深入安全的一个很好的例子。

每周审计:2019年,周#14

exakat包括A.‘weekly’报告:此报告采用五项分析为构建。这意味着短暂的审计报告,几乎没有问题审查。读取它们并不是很多,并在代码中查看它们。 PHP社区中的每个人都可以专注于一个经典的编码问题并解决它。谈谈周围的每周审计:你’LL找到面临同样挑战的程序员。

获得‘weekly’审核,运行审计,请求‘Weekly’ report.

# Init the project (skip when it is already done)    
php exakat.phar init -p <yourproject> -R //github.com/Seldaek/monolog.git -git 

# Run the project (skip when it is already done)    
php exakat.phar project -p <yourproject> 

# Export the weekly project (every monday)    
php exakat.phar report -p <yourproject> -format Weekly 

# Open projects/<yourproject>/weekly/index.html in your browser    

每周,您可以在此找到5个新分析,以便在您的代码中审查。事实上,当您的代码干净时,您也可以快速查看即将到来的  

每周 recommendations for PHP code review : 2018, week 2019-18

快乐的PHP代码评论 

所有352个分析仪都介绍在文档中,包括盛大: 数组中的非常量索引::未定义的常量,用作数组索引,恢复字符串并仍然产生预期的行为。然而,它也产生了警告。

它仍然是一个不寻常的错误(26%),但它应该只是影响旧的应用程序。 

您可以查看图库中的所有exakat报告: exakat画廊.

下载exakat.io,安装它 Docker.,升级它‘exakat.phar升级-u’ and like us on GitHub..