<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>程默的博客 &#187; 参数检查</title>
	<atom:link href="http://blog.chacuo.net/tag/%e5%8f%82%e6%95%b0%e6%a3%80%e6%9f%a5/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.chacuo.net</link>
	<description>web原理、web架构、web安全、web性能、服务器性能、服务器架构、服务器安全;你不能预知明天，但你可以利用今天。你不能样样顺利，但你可以事事尽力!</description>
	<lastBuildDate>Mon, 31 Aug 2020 15:33:40 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>web应用安全参数检测方法（检测输入参数方法）</title>
		<link>http://blog.chacuo.net/360.html</link>
		<comments>http://blog.chacuo.net/360.html#comments</comments>
		<pubDate>Fri, 19 Jul 2013 08:48:33 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[web安全]]></category>
		<category><![CDATA[参数检查]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=360</guid>
		<description><![CDATA[前面我们说到，web应用安全的基数是，做好参数检测！就像是小区防止小偷，必须把好所有进入门。然后，对进入人员进 [...]]]></description>
				<content:encoded><![CDATA[<p>前面我们说到，web应用安全的基数是，做好参数检测！就像是小区防止小偷，必须把好所有进入门。然后，对进入人员进行检测！这些我们都清楚的，就是有时候在web应用中，对输入参数检测时候发现困难！因为，输入参数字符可以各种各样，长度也不相同！我们从什么维度准确标识出我所需要的格式呢？</p>
<p>这里我观点是，应用对参数检测可以分为2个关卡，第一个关卡可以是，保证参数输入安全。第二个关卡是保证它是业务所需要的值。一个应用，保证安全是最基础的。我们第一关检测参数，怎么样做比较好呢？</p>
<p><strong>标识参数方法？</strong></p>
<p>所有web传入都是字符串，我们怎么样标识字符串呢？字符串都是有字符组成的，常见是ascii码，对于中文网站，有gb2312,gbk等字符。从这里看，字符个数会很多。它们之间如果做长度不一组合字符串，将会更多了。 因此，再一次说明，不要用现在字符串方法，来检测！有可能你需要限制是无底洞！可以说，对于我们一个web应用参数，90%以上，基本在ascii码就可以，很少参数会突变到这100多个字符范围。所以，标识一个字符串，可以从以下2个方面来限制：</p>
<blockquote><p>1、字符串 中字符范围 （如：如果是手机号0-9，用户名可能是字母+数字之类）</p>
<p>2、字符串 长度 （如手机号是：11位，用户名可能是：6-15位）</p>
</blockquote>
<p>以上方法可以保证，不在用户需要字符范围的字符，一定不能进入后端！我们看看一般例子！</p>
<blockquote>

<div class="wp_syntax"><table><tr><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #009933; font-style: italic;">/**
*读取get值
*@copyright  http://blog.chacuo.net
*@author 8292669
*@param $k string get参数名称
*@param $p string 正则表达式内容
*@return string|array 读取值
*/</span>
<span style="color: #000000; font-weight: bold;">function</span> input_get<span style="color: #009900;">&#40;</span><span style="color: #000088;">$k</span><span style="color: #339933;">,</span><span style="color: #000088;">$p</span><span style="color: #339933;">=</span><span style="color: #0000ff;">'.*'</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$v</span> <span style="color: #339933;">=</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$k</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>?<span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$k</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">:</span><span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$v</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$_v</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$v</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$k</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$_v1</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$_v</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$k</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=!</span><span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/^&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$p</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;$/&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$_v1</span><span style="color: #009900;">&#41;</span>?<span style="color: #0000ff;">''</span><span style="color: #339933;">:</span><span style="color: #000088;">$_v1</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">return</span>  <span style="color: #000088;">$_v</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #339933;">!</span><span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/^&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$p</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;$/&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$v</span><span style="color: #009900;">&#41;</span>?<span style="color: #0000ff;">''</span><span style="color: #339933;">:</span><span style="color: #000088;">$v</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

</blockquote>
<p>测试：var_dump(input_get(&#8216;a&#8217;,'\d+&#8217;),input_get(&#8216;b&#8217;,'\d+&#8217;));&nbsp; 读取a,b参数，都为数字的！ </p>
<blockquote><pre><a href="http://blog.chacuo.net/wp-content/uploads/2013/07/image2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="web应用安全参数检测方法" border="0" alt="web应用安全参数检测方法" src="http://blog.chacuo.net/wp-content/uploads/2013/07/image_thumb2.png" width="881" height="372"></a> </pre>
<pre>因为参数b输入是：2ccc，因此不是0-9字符。所以返回为空字符串！</pre>
</blockquote>
<p>上面这样每次输入正则表达式确实很麻烦的，其实，一个应用，业务字段，应该都比较固定，我们可以再在该基础上面，进一步封装些，取独立业务字段函数。如：input_getUser($k) 专门读取用户名，input_getQQ($k)专门读取QQ号。如此类推，然后我们发现真的需要独立写检测的变得非常少了！</p>
<p><strong>怎么样限制中文字符？</strong></p>
<p>我有一个真实姓名框，需要输入真实姓名！我该怎么样检测？我们知道常见中文字符表是gb2312，其实中国人取名字现在都需要在常见汉字里面挑选。也就是在区位码表中找。所以，我们问题就变成了，怎么样检查用户输入是不是在gb2312字符集中。gb2312是多字节的，一个中文都是2个字节。只要我们先对好范围就可以了。 gb2312字符集表，我们可以查看：<a title="gb2312字符集、编码表" href="http://doc.chacuo.net/gb2312" target="_blank">http://doc.chacuo.net/gb2312</a> ，</p>
<blockquote><pre><a href="http://blog.chacuo.net/wp-content/uploads/2013/07/image3.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="gb2312字符集" border="0" alt="gb2312字符集" src="http://blog.chacuo.net/wp-content/uploads/2013/07/image_thumb3.png" width="887" height="559"></a> </pre>
<p>第一个字节范围是：A1-F7 第2个字节范围是A1-FE ，因此我们正则表达式可以写成：[\xA1-\xF7][\xA1-\xFE] 就可以对2个字节限制了。 “怎么拿过去用不了?”，这里我们做中文限制，只完成第一步，在指定字符集中，找好需要用到中文的字符编码。第二步，就是你要将原字符串转码为该字符集编码。如：你如果是utf-8编码，你需要将获取字符串先转码为gb2312，然后再用gb2312字符位置 正则表达式来检测！ 如果，你不转码，你发现刚刚找的那个字符位置正则表达式毫无用处了！通过这个，我们注意做中文位置检测时注意：</p>
<p>1、选择好字符集，找好字符位置，准备好字符范围的正则表达式</p>
<p>2、将待检测字符串，转码为选号的字符集的编码</p>
</blockquote>
<p>现在，我们知道了字符串检测方法了，无论简单参数、还是复杂中文字符参数！我们都可以轻松完成了！通过字符串中字符范围定位需要字符在实际检测中，非常安全！ 因为，很多经常出现问题字符，都不会出现在应用的参数中！只要我们保证第一个关卡，只允许包含业务相关的字符的字符串进入！应用安全，基本上没有问题！好了，就到这里吧！欢迎朋友们发表自己观点！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/360.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>web应用安全之基础（输入参数检查必要性）</title>
		<link>http://blog.chacuo.net/331.html</link>
		<comments>http://blog.chacuo.net/331.html#comments</comments>
		<pubDate>Wed, 10 Jul 2013 11:51:49 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[web安全]]></category>
		<category><![CDATA[参数检查]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=331</guid>
		<description><![CDATA[好几天没有写了，电脑一直有问题，还没有修好！本来开机故障，修理了下！现在是彻底开机不了！算了，随它去吧，该换个 [...]]]></description>
				<content:encoded><![CDATA[<p>好几天没有写了，电脑一直有问题，还没有修好！本来开机故障，修理了下！现在是彻底开机不了！算了，随它去吧，该换个品牌了！先不说这些，我们进入正题，看看web应用安全基数，为什么是输入参数检查！开发web应用，工作中代码审核、漏洞修复！基本是我们对输入参数检查不够！</p>
<blockquote><p><strong>主要问题出现在3个方面：</strong></p>
<p>1、对检查认识不够！经常忘记必要参数检测，特别对于一些页面只是传值，而没有写入到后端存储的参数，更是很容易遗漏！</p>
<p>2、对那些是输入的、那些是系统环境参数 有些没有明白，导致错误的放过该检查的参数！</p>
<p>3、检查方法不正确、往往检查过后，还存在问题！ </p>
</blockquote>
<p>&#160;</p>
<p>我说说自己的一些看法吧，所有一切首先要认识到参数检查的重要性！</p>
<p><strong>为什么要参数检查？</strong></p>
<p>我们还是从生活中来看吧，现在社会上，下班回家进入小区，门口保安要检查门卡，有卡才可以进入！到公司了，进门禁系统，公司需要刷员工卡，然后进入公司！现在学校、机关等等，我们发现都会有个检查的，大家都很清楚，它的目的是保证大家安全，让一些自己允许的人才可以进入！我们发现，所有检查地点，都是在分界隔离地方，也就是在进入的入口上！</p>
<p>从上面这些场景，我们发现生活中，为了我们安全！在进入一些私人区域，都有检查口。其实web检查也是可以比拟的！web参数是最前端用户与系统接口地方，因此这个地方检查是必要的！我们只能允许满足要求的进入后端系统！这也是保证后端系统安全的前提！</p>
<p><strong>漏掉该检查地方隐患！</strong></p>
<p>这个问题，同样存在！前段时间，听到一个新闻，一个很高档的小区有很好的安全门禁检查！但是，它的地下车库到楼上，就没有增加检查！后来，一些别有用心的人，专门租车，从地下车库上到居民楼，进行偷盗！还有个新闻，一个小区进门地方，如果是单人的话，会检查，但是如果你开车进入，特别是名牌车！基本上不检查！后来，也导致一伙别有用心的人，驾车进入偷盗！我们做web应用，一定要知道那些参数来源于用户端输入，php代码里面的：$_GET,$_POST,$_REQUEST,$_SERVER,$_COOKIE,$_FILES等。那些来自用户，那些是系统！清清楚楚，明明白白检查！</p>
<p><strong>怎么样检查才正确？</strong></p>
<p>这些我们也可以看看现实生活中，我们发现公司、小区、学校，每个进入的人，都要有一张发的卡，只有持卡人才可以进入！这个是限定用户范围的，只有限定范围才可以进入！这种检查方法，很常用的，也很安全！换个思路，如果小区里面，认为自己小区高档，来小区的都穿着不错。因此，把检查改为：穿正装可以进入！这样一来，如果刚好小区里面有人因为某种原因，而穿着匆忙，可能不让进入！而另外，对于别有用心的人，买套正式衣服应该很容易！因此，也很容易逃过检查！</p>
<p>从上面两个例子我们不难发现，生活中经常检测是：通过发卡，限定用户群；而少用排除法方法！这也是，我们web参数检查中推荐的方法，限定参数的范围；不做、少做参数过滤替换检查！</p>
<p>好了，上面这些方法其实都来自生活，大家一看都明白！如果真的遇到做参数检查时候，有些迷糊！不妨想想生活中例子！其实，程序都是解决实际生活中问题，并且很多都来自于生活！参数需要检查、并且需要正确检查！下一节我将，谈谈对于参数检查范围检查的一些自己看法！欢迎大家交流！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/331.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
