仙了人间作者 發表於 2019-7-21 11:41:00

PHP如何防止XSS攻击

<p>PHP防止XSS跨站脚本攻击的方法:<strong>是针对非法的HTML代码包括单双引号等,使用htmlspecialchars()函数</strong> 。</p>
<p>在使用htmlspecialchars()函数的时候注意第二个参数, 直接用htmlspecialchars($string) 的话,第二个参数默认是ENT_COMPAT,函数默认只是转化双引号(“), 不对单引号(‘)做转义.</p>
<p>所以,htmlspecialchars函数更多的时候要加上第二个参数, 应该这样用: htmlspecialchars($string,ENT_QUOTES).当然,如果需要不转化任何引号,用htmlspecialchars($string,ENT_NOQUOTES).</p>
<p>另外, 尽量少用htmlentities, 在全部英文的时候htmlentities和htmlspecialchars没有区别,都可以达到目的.但是,中文情况下, htmlentities却会转化所有的html代码,连同里面的它无法识别的中文字符也给转化了。</p>
<p>htmlentities和htmlspecialchars这两个函数对 '之类的字符串支持不好,都不能转化, 所以用htmlentities和htmlspecialchars转化的字符串只能防止XSS攻击,不能防止SQL注入攻击.</p>
<p>所有有打印的语句如echo,print等 在打印前都要使用htmlentities() 进行过滤,这样可以防止Xss,注意中文要写出htmlentities($name,ENT_NOQUOTES,GB2312) 。</p>
<p>&nbsp; (1).网页不停地刷新 '&lt;meta http-equiv="refresh" content="0;"&gt;'</p>
<p>&nbsp; (2).嵌入其它网站的链接 &lt;iframe src=http://xxxx width=250 height=250&gt;&lt;/iframe&gt; &nbsp;除了通过正常途径输入XSS攻击字符外,还可以绕过JavaScript校验,通过修改请求达到XSS攻击的目的.</p>
<div class="cnblogs_code">
<pre>&lt;?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">php防注入和XSS攻击通用过滤</span>
<span style="color: rgba(128, 0, 128, 1)">$_GET</span>   &amp;&amp; SafeFilter(<span style="color: rgba(128, 0, 128, 1)">$_GET</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$_POST</span>    &amp;&amp; SafeFilter(<span style="color: rgba(128, 0, 128, 1)">$_POST</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$_COOKIE</span>&amp;&amp; SafeFilter(<span style="color: rgba(128, 0, 128, 1)">$_COOKIE</span><span style="color: rgba(0, 0, 0, 1)">);

</span><span style="color: rgba(0, 0, 255, 1)">function</span> SafeFilter (&amp;<span style="color: rgba(128, 0, 128, 1)">$arr</span><span style="color: rgba(0, 0, 0, 1)">)
{
   </span><span style="color: rgba(128, 0, 128, 1)">$ra</span>=<span style="color: rgba(0, 0, 255, 1)">Array</span>('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/','/script/','/javascript/','/vbscript/','/expression/','/applet/'
   ,'/meta/','/xml/','/blink/','/link/','/style/','/embed/','/object/','/frame/','/layer/','/title/','/bgsound/'
   ,'/base/','/onload/','/onunload/','/onchange/','/onsubmit/','/onreset/','/onselect/','/onblur/','/onfocus/',
   '/onabort/','/onkeydown/','/onkeypress/','/onkeyup/','/onclick/','/ondblclick/','/onmousedown/','/onmousemove/'
   ,'/onmouseout/','/onmouseover/','/onmouseup/','/onunload/'<span style="color: rgba(0, 0, 0, 1)">);
   
   </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 128, 128, 1)">is_array</span>(<span style="color: rgba(128, 0, 128, 1)">$arr</span><span style="color: rgba(0, 0, 0, 1)">))
   {
   </span><span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(128, 0, 128, 1)">$arr</span> <span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(128, 0, 128, 1)">$key</span> =&gt; <span style="color: rgba(128, 0, 128, 1)">$value</span><span style="color: rgba(0, 0, 0, 1)">)
   {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 128, 128, 1)">is_array</span>(<span style="color: rgba(128, 0, 128, 1)">$value</span><span style="color: rgba(0, 0, 0, 1)">))
      {
          </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 128, 128, 1)">get_magic_quotes_gpc</span>())<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">不对magic_quotes_gpc转义过的字符使用addslashes(),避免双重转义。</span>
<span style="color: rgba(0, 0, 0, 1)">          {
             </span><span style="color: rgba(128, 0, 128, 1)">$value</span>= <span style="color: rgba(0, 128, 128, 1)">addslashes</span>(<span style="color: rgba(128, 0, 128, 1)">$value</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">给单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)</span>
<span style="color: rgba(0, 0, 0, 1)">             #加上反斜线转义
          }
          </span><span style="color: rgba(128, 0, 128, 1)">$value</span>       = <span style="color: rgba(0, 128, 128, 1)">preg_replace</span>(<span style="color: rgba(128, 0, 128, 1)">$ra</span>,'',<span style="color: rgba(128, 0, 128, 1)">$value</span>);   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">删除非打印字符,粗暴式过滤xss可疑字符串</span>
          <span style="color: rgba(128, 0, 128, 1)">$arr</span>[<span style="color: rgba(128, 0, 128, 1)">$key</span>]   = <span style="color: rgba(0, 128, 128, 1)">htmlentities</span>(<span style="color: rgba(0, 128, 128, 1)">strip_tags</span>(<span style="color: rgba(128, 0, 128, 1)">$value</span>)); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">去除 HTML 和 PHP 标记并转换为 HTML 实体</span>
<span style="color: rgba(0, 0, 0, 1)">      }
      </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
      {
          SafeFilter(</span><span style="color: rgba(128, 0, 128, 1)">$arr</span>[<span style="color: rgba(128, 0, 128, 1)">$key</span><span style="color: rgba(0, 0, 0, 1)">]);
      }
   }
   }
}
</span>?&gt;
<span style="color: rgba(128, 0, 128, 1)">$str</span> = 'www.90boke.com&lt;meta http-equiv="refresh" content="0;"&gt;'<span style="color: rgba(0, 0, 0, 1)">;
SafeFilter (</span><span style="color: rgba(128, 0, 128, 1)">$str</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">如果你把这个注释掉,提交之后就会无休止刷新</span>
<span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 128, 1)">$str</span>;</pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">------------------------------php防注入和XSS攻击通用过滤-----Start--------------------------------------------//</span>
<span style="color: rgba(0, 0, 255, 1)">function</span> string_remove_xss(<span style="color: rgba(128, 0, 128, 1)">$html</span><span style="color: rgba(0, 0, 0, 1)">) {
    </span><span style="color: rgba(0, 128, 128, 1)">preg_match_all</span>("/\&lt;([^\&lt;]+)\&gt;/is", <span style="color: rgba(128, 0, 128, 1)">$html</span>, <span style="color: rgba(128, 0, 128, 1)">$ms</span><span style="color: rgba(0, 0, 0, 1)">);

    </span><span style="color: rgba(128, 0, 128, 1)">$searchs</span>[] = '&lt;'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(128, 0, 128, 1)">$replaces</span>[] = '&amp;lt;'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(128, 0, 128, 1)">$searchs</span>[] = '&gt;'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(128, 0, 128, 1)">$replaces</span>[] = '&amp;gt;'<span style="color: rgba(0, 0, 0, 1)">;

    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$ms</span>) {
      </span><span style="color: rgba(128, 0, 128, 1)">$allowtags</span> = 'img|a|font|div|table|tbody|caption|tr|td|th|br|p|b|strong|i|u|em|span|ol|ul|li|blockquote'<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$ms</span> = <span style="color: rgba(0, 128, 128, 1)">array_unique</span>(<span style="color: rgba(128, 0, 128, 1)">$ms</span>);
      </span><span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(128, 0, 128, 1)">$ms</span> <span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(128, 0, 128, 1)">$value</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(128, 0, 128, 1)">$searchs</span>[] = "&amp;lt;".<span style="color: rgba(128, 0, 128, 1)">$value</span>."&amp;gt;"<span style="color: rgba(0, 0, 0, 1)">;

            </span><span style="color: rgba(128, 0, 128, 1)">$value</span> = <span style="color: rgba(0, 128, 128, 1)">str_replace</span>('&amp;amp;', '_uch_tmp_str_', <span style="color: rgba(128, 0, 128, 1)">$value</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(128, 0, 128, 1)">$value</span> = string_htmlspecialchars(<span style="color: rgba(128, 0, 128, 1)">$value</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(128, 0, 128, 1)">$value</span> = <span style="color: rgba(0, 128, 128, 1)">str_replace</span>('_uch_tmp_str_', '&amp;amp;', <span style="color: rgba(128, 0, 128, 1)">$value</span><span style="color: rgba(0, 0, 0, 1)">);

            </span><span style="color: rgba(128, 0, 128, 1)">$value</span> = <span style="color: rgba(0, 128, 128, 1)">str_replace</span>(<span style="color: rgba(0, 0, 255, 1)">array</span>('\\', '/*'), <span style="color: rgba(0, 0, 255, 1)">array</span>('.', '/.'), <span style="color: rgba(128, 0, 128, 1)">$value</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(128, 0, 128, 1)">$skipkeys</span> = <span style="color: rgba(0, 0, 255, 1)">array</span>('onabort','onactivate','onafterprint','onafterupdate','onbeforeactivate','onbeforecopy','onbeforecut','onbeforedeactivate',
                  'onbeforeeditfocus','onbeforepaste','onbeforeprint','onbeforeunload','onbeforeupdate','onblur','onbounce','oncellchange','onchange',
                  'onclick','oncontextmenu','oncontrolselect','oncopy','oncut','ondataavailable','ondatasetchanged','ondatasetcomplete','ondblclick',
                  'ondeactivate','ondrag','ondragend','ondragenter','ondragleave','ondragover','ondragstart','ondrop','onerror','onerrorupdate',
                  'onfilterchange','onfinish','onfocus','onfocusin','onfocusout','onhelp','onkeydown','onkeypress','onkeyup','onlayoutcomplete',
                  'onload','onlosecapture','onmousedown','onmouseenter','onmouseleave','onmousemove','onmouseout','onmouseover','onmouseup','onmousewheel',
                  'onmove','onmoveend','onmovestart','onpaste','onpropertychange','onreadystatechange','onreset','onresize','onresizeend','onresizestart',
                  'onrowenter','onrowexit','onrowsdelete','onrowsinserted','onscroll','onselect','onselectionchange','onselectstart','onstart','onstop',
                  'onsubmit','onunload','javascript','script','eval','behaviour','expression','style','class'<span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(128, 0, 128, 1)">$skipstr</span> = <span style="color: rgba(0, 128, 128, 1)">implode</span>('|', <span style="color: rgba(128, 0, 128, 1)">$skipkeys</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(128, 0, 128, 1)">$value</span> = <span style="color: rgba(0, 128, 128, 1)">preg_replace</span>(<span style="color: rgba(0, 0, 255, 1)">array</span>("/(<span style="color: rgba(128, 0, 128, 1)">$skipstr</span>)/i"), '.', <span style="color: rgba(128, 0, 128, 1)">$value</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 128, 128, 1)">preg_match</span>("/^[\/|\s]?(<span style="color: rgba(128, 0, 128, 1)">$allowtags</span>)(\s+|$)/is", <span style="color: rgba(128, 0, 128, 1)">$value</span><span style="color: rgba(0, 0, 0, 1)">)) {
                </span><span style="color: rgba(128, 0, 128, 1)">$value</span> = ''<span style="color: rgba(0, 0, 0, 1)">;
            }
            </span><span style="color: rgba(128, 0, 128, 1)">$replaces</span>[] = <span style="color: rgba(0, 0, 255, 1)">empty</span>(<span style="color: rgba(128, 0, 128, 1)">$value</span>) ? '' : "&lt;" . <span style="color: rgba(0, 128, 128, 1)">str_replace</span>('&amp;quot;', '"', <span style="color: rgba(128, 0, 128, 1)">$value</span>) . "&gt;"<span style="color: rgba(0, 0, 0, 1)">;
      }
    }
    </span><span style="color: rgba(128, 0, 128, 1)">$html</span> = <span style="color: rgba(0, 128, 128, 1)">str_replace</span>(<span style="color: rgba(128, 0, 128, 1)">$searchs</span>, <span style="color: rgba(128, 0, 128, 1)">$replaces</span>, <span style="color: rgba(128, 0, 128, 1)">$html</span><span style="color: rgba(0, 0, 0, 1)">);

    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$html</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">php防注入和XSS攻击通用过滤 </span>
<span style="color: rgba(0, 0, 255, 1)">function</span> string_htmlspecialchars(<span style="color: rgba(128, 0, 128, 1)">$string</span>, <span style="color: rgba(128, 0, 128, 1)">$flags</span> = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 128, 128, 1)">is_array</span>(<span style="color: rgba(128, 0, 128, 1)">$string</span><span style="color: rgba(0, 0, 0, 1)">)) {
      </span><span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(128, 0, 128, 1)">$string</span> <span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(128, 0, 128, 1)">$key</span> =&gt; <span style="color: rgba(128, 0, 128, 1)">$val</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(128, 0, 128, 1)">$string</span>[<span style="color: rgba(128, 0, 128, 1)">$key</span>] = string_htmlspecialchars(<span style="color: rgba(128, 0, 128, 1)">$val</span>, <span style="color: rgba(128, 0, 128, 1)">$flags</span><span style="color: rgba(0, 0, 0, 1)">);
      }
    } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$flags</span> === <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(128, 0, 128, 1)">$string</span> = <span style="color: rgba(0, 128, 128, 1)">str_replace</span>(<span style="color: rgba(0, 0, 255, 1)">array</span>('&amp;', '"', '&lt;', '&gt;'), <span style="color: rgba(0, 0, 255, 1)">array</span>('&amp;amp;', '&amp;quot;', '&amp;lt;', '&amp;gt;'), <span style="color: rgba(128, 0, 128, 1)">$string</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 128, 128, 1)">strpos</span>(<span style="color: rgba(128, 0, 128, 1)">$string</span>, '&amp;amp;#') !== <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">) {
                </span><span style="color: rgba(128, 0, 128, 1)">$string</span> = <span style="color: rgba(0, 128, 128, 1)">preg_replace</span>('/&amp;amp;((#(\d{3,5}|x{4}));)/', '&amp;\\1', <span style="color: rgba(128, 0, 128, 1)">$string</span><span style="color: rgba(0, 0, 0, 1)">);
            }
      } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(255, 0, 255, 1)">PHP_VERSION</span> &lt; '5.4.0'<span style="color: rgba(0, 0, 0, 1)">) {
                </span><span style="color: rgba(128, 0, 128, 1)">$string</span> = <span style="color: rgba(0, 128, 128, 1)">htmlspecialchars</span>(<span style="color: rgba(128, 0, 128, 1)">$string</span>, <span style="color: rgba(128, 0, 128, 1)">$flags</span><span style="color: rgba(0, 0, 0, 1)">);
            } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 128, 128, 1)">defined</span>('CHARSET') || (<span style="color: rgba(0, 128, 128, 1)">strtolower</span>(CHARSET) == 'utf-8'<span style="color: rgba(0, 0, 0, 1)">)) {
                  </span><span style="color: rgba(128, 0, 128, 1)">$charset</span> = 'UTF-8'<span style="color: rgba(0, 0, 0, 1)">;
                } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                  </span><span style="color: rgba(128, 0, 128, 1)">$charset</span> = 'ISO-8859-1'<span style="color: rgba(0, 0, 0, 1)">;
                }
                </span><span style="color: rgba(128, 0, 128, 1)">$string</span> = <span style="color: rgba(0, 128, 128, 1)">htmlspecialchars</span>(<span style="color: rgba(128, 0, 128, 1)">$string</span>, <span style="color: rgba(128, 0, 128, 1)">$flags</span>, <span style="color: rgba(128, 0, 128, 1)">$charset</span><span style="color: rgba(0, 0, 0, 1)">);
            }
      }
    }

    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$string</span><span style="color: rgba(0, 0, 0, 1)">;
}

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">------------------php防注入和XSS攻击通用过滤-----End--------------------------------------------//</span></pre>
</div>
<h2>PHP中的设置&nbsp;</h2>
<p>PHP5.2以上版本已支持HttpOnly参数的设置,同样也支持全局的HttpOnly的设置,在php.ini中</p>
<div class="cnblogs_code">
<pre>-----------------------------------------------------<span style="color: rgba(0, 0, 0, 1)">
session</span>.cookie_httponly =
-----------------------------------------------------</pre>
</div>
<p>设置其值为1或者TRUE,来开启全局的Cookie的HttpOnly属性,当然也支持在代码中来开启:&nbsp;</p>
<div class="cnblogs_code">
<pre>&lt;?php <span style="color: rgba(0, 128, 128, 1)">ini_set</span>("session.cookie_httponly", 1<span style="color: rgba(0, 0, 0, 1)">);   
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> or session_set_cookie_params(0, NULL, NULL, NULL, TRUE);   </span>
?&gt;</pre>
</div>
<p>Cookie操作函数setcookie函数和setrawcookie函数也专门添加了第7个参数来做为HttpOnly的选项,开启方法为:&nbsp;</p>
<div class="cnblogs_code">
<pre>&lt;?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 128, 1)">setcookie</span>("abc", "test", <span style="color: rgba(0, 0, 255, 1)">NULL</span>, <span style="color: rgba(0, 0, 255, 1)">NULL</span>, <span style="color: rgba(0, 0, 255, 1)">NULL</span>, <span style="color: rgba(0, 0, 255, 1)">NULL</span>, <span style="color: rgba(0, 0, 255, 1)">TRUE</span><span style="color: rgba(0, 0, 0, 1)">);   
</span><span style="color: rgba(0, 128, 128, 1)">setrawcookie</span>("abc", "test", <span style="color: rgba(0, 0, 255, 1)">NULL</span>, <span style="color: rgba(0, 0, 255, 1)">NULL</span>, <span style="color: rgba(0, 0, 255, 1)">NULL</span>, <span style="color: rgba(0, 0, 255, 1)">NULL</span>, <span style="color: rgba(0, 0, 255, 1)">TRUE</span><span style="color: rgba(0, 0, 0, 1)">);
</span>?&gt;</pre>
</div>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/mzhaox/p/11220684.html
頁: [1]
查看完整版本: PHP如何防止XSS攻击