<?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>Terrysco&#039;s Blog &#187; security</title>
	<atom:link href="http://www.terrysco.com/node/tag/security/feed" rel="self" type="application/rss+xml" />
	<link>http://www.terrysco.com</link>
	<description>仅关注于互联网行业， Linux平台开发。</description>
	<lastBuildDate>Sat, 05 Nov 2011 21:24:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>PHP Architect&#8217;s Guide to PHP Security [3]</title>
		<link>http://www.terrysco.com/node/php-security-guide-3.html</link>
		<comments>http://www.terrysco.com/node/php-security-guide-3.html#comments</comments>
		<pubDate>Sat, 03 Jan 2009 19:02:39 +0000</pubDate>
		<dc:creator>terrysco</dc:creator>
				<category><![CDATA[Book Remarks]]></category>
		<category><![CDATA[PHP/Python/Ruby]]></category>
		<category><![CDATA[Web Security]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://www.anyliv.com/www.terrysco.com/?p=75</guid>
		<description><![CDATA[<p>今天继续翻译PHP Architect's Guide to PHP Security这本书的第三章《SQL注入》。由于第二章XSS有专门的书籍介绍，以后会专门翻译，所以暂时跳过XSS，先对SQL Injection进行介绍。</p><p>SQL注入是另一种常见的漏洞（针对XSS来说），是由于对输入数据过滤不严导致的。它不像XSS是直接针对站点的用户，而是直接破坏站点本身，特别是数据库。SQL注入的目的是插入任意数据，常常是插入一条被数据库执行的SQL语句。这些潜伏的被插入语句常常执行很多操作，从获取数据到更改或删除数据库信息。</p>...
]]></description>
			<content:encoded><![CDATA[<p>今天继续翻译PHP Architect&#8217;s Guide to PHP Security这本书的第三章《SQL注入》。由于第二章XSS有专门的书籍介绍，以后会专门翻译，所以暂时跳过XSS，先对SQL Injection进行介绍。</p>
<p>SQL注入是另一种常见的漏洞（针对XSS来说），是由于对输入数据过滤不严导致的。它不像XSS是直接针对站点的用户，而是直接破坏站点本身，特别是数据库。SQL注入的目的是插入任意数据，常常是插入一条被数据库执行的SQL语句。这些潜伏的被插入语句常常执行很多操作，从获取数据到更改或删除数据库信息。</p>
<p>// supposed input<br />$name = &ldquo;ilia&rsquo;; DELETE FROM users;&rdquo;;<br />mysql_query(&ldquo;SELECT * FROM users WHERE name=&rsquo;{$name}&rsquo;&rdquo;);<br />这段功能本来是想从user表中获取匹配name字段的数据，一般情况下，name变量是一些字母数字和空白字符的组合，比如字符串&ldquo;ilia&rdquo;，但如果我们附加了查询语句，这条注入的查询语句将会删除users表中的所有记录。（幸运的是，mysql的mysql_query函数不允许堆查询，在一次调用中不允许执行多次查询，但是SQLite和postgresql扩展是可以的。</p>
<p>PHP的自动转义机制GPC提供了一些基本保护，如果启用了magic_quotes_gpc，将会对单引，双引等一些字符进行转义（在前面加反斜线）。但是magic quotes不包括所有需要转义的字符，并且这个特性不总是开启的。所以你需要自己用代码来阻止SQL注入。</p>
<p>php的很多数据库扩展有自己专门的转义机制，例如Mysql扩展的mysql_real_escape_string()函数。</p>
<p>if (get_magic_quotes_gpc()) {<br />&nbsp; $name = stripslashes($name);<br />}<br />$name = mysql_real_escape_string($name);<br />mysql_query(&ldquo;SELECT * FROM users WHERE name=&rsquo;{$name}&rsquo;&rdquo;);<br />在调用数据库扩展的转义机制之前，首先要对magic quotes的状态进行检查，如果magic guotes启用了，则要去掉它可能添加的反斜线，以免输入数据被转义2次。</p>
<p>待续。。。有点累了。</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.terrysco.com/node/php-security-guide-3.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>关于drupal安全</title>
		<link>http://www.terrysco.com/node/drupal-code-security.html</link>
		<comments>http://www.terrysco.com/node/drupal-code-security.html#comments</comments>
		<pubDate>Thu, 06 Nov 2008 20:59:33 +0000</pubDate>
		<dc:creator>terrysco</dc:creator>
				<category><![CDATA[CMS/FrameWork]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[drupal]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://www.anyliv.com/www.terrysco.com/?p=53</guid>
		<description><![CDATA[<p>大家都知道php编码漏洞造成的问题严重性，而drupal恰恰是用PHP实现的。幸好drupal有很多的内置方法帮我们处理一些安全方面的问题，只要熟悉就能很大程度确保安全。</p><p>form表单提交过来的数据本来是可以构造的，但drupal给我们提供了一个token机制，提交后会判断值是否为表单内置的几个值其中之一，这样就为checkbox，select等控件提供了一定安全保障。</p><p>另外drupal数据流的原则是原样保存到数据库中，输出的时候做过滤和转义。也就是说不管用户输入什么数据，包括html字符等等，只要我们使用drupal的内置db接口，就不会有问题，原样保存，输出的时候如果是文本数据用check_plain()函数做下处理，基本就没什么问题了，至于需要一些简单的样式或者需要特定的html字符，我们用filter_xss()函数即可处理。</p>...
]]></description>
			<content:encoded><![CDATA[<p>大家都知道php编码漏洞造成的问题严重性，而drupal恰恰是用PHP实现的。幸好drupal有很多的内置方法帮我们处理一些安全方面的问题，只要熟悉就能很大程度确保安全。</p>
<p>form表单提交过来的数据本来是可以构造的，但drupal给我们提供了一个token机制，提交后会判断值是否为表单内置的几个值其中之一，这样就为checkbox，select等控件提供了一定安全保障。</p>
<p>另外drupal数据流的原则是原样保存到数据库中，输出的时候做过滤和转义。也就是说不管用户输入什么数据，包括html字符等等，只要我们使用drupal的内置db接口，就不会有问题，原样保存，输出的时候如果是文本数据用check_plain()函数做下处理，基本就没什么问题了，至于需要一些简单的样式或者需要特定的html字符，我们用filter_xss()函数即可处理。</p>
<p>总之，输出用户提供的数据时要格外小心，drupal的安全漏洞公告有几个模块都是因为这样的问题导致的，包括5.11版本的book模块标题没有转义。更多的安全常识和知识还要多参考php安全方面的东西，很喜欢《PHP Security Guide》中那句话：Security is a measurement, not a characteristic.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.terrysco.com/node/drupal-code-security.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP Architect&#8217;s Guide to PHP Security [2]</title>
		<link>http://www.terrysco.com/node/php-security-guide-2.html</link>
		<comments>http://www.terrysco.com/node/php-security-guide-2.html#comments</comments>
		<pubDate>Wed, 08 Oct 2008 13:04:11 +0000</pubDate>
		<dc:creator>terrysco</dc:creator>
				<category><![CDATA[Book Remarks]]></category>
		<category><![CDATA[Web Security]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://www.anyliv.com/www.terrysco.com/?p=45</guid>
		<description><![CDATA[<p>White List Validation （白名单验证）<br />Being Careful with File Uploads （文件上传时要小心）<br />File Content Validation （文件内容验证）<br />Accessing Uploaded Data （访问上传数据）<br />The Dangers of Magic Quotes （Magic Quotes的危险性）<br />Magic Quotes Normalization （Magic Quotes正规化）<br />...</p>
]]></description>
			<content:encoded><![CDATA[<p>White List Validation （白名单验证）<br />Being Careful with File Uploads （文件上传时要小心）<br />File Content Validation （文件内容验证）<br />Accessing Uploaded Data （访问上传数据）<br />The Dangers of Magic Quotes （Magic Quotes的危险性）<br />Magic Quotes Normalization （Magic Quotes正规化）<br />Validating Serialized Data （验证序列化数据）<br />External Resource Validation （外部资源验证）</p>
<p>Assumption is the enemy of security and making assumptions about user input is a sure way to allow an attacker to subvert your code. 又一次强调开发者的假设所带来的后果。对开发者来说，普遍假设selection box和check box以及radio button和hidden字段值是不用验证的，这就完全错了，<br />因为恶意用户可以拷贝html表单代码并且修改后来进行恶意提交任意数据。比起黑名单的概念，我们最好还是选择白名单，也就是说我们给出合法的值，然后验证是否合法；而不是给出不合法的值，验证值是否非法。显然后者不如前者来得安全。这里作者给出一个例子，说明了这个问题：<br />$months = array(&ldquo;January&rdquo;, &ldquo;February&rdquo;, /* &#8230; */); <br />if (empty($_POST[&lsquo;month&rsquo;]) || !in_array($_POST[&lsquo;month&rsquo;], $months)) {<br />&nbsp;&nbsp; exit(&ldquo;Quit hacking, you&rsquo;re not a lumberjack!&rdquo;);<br />}</p>
<p>关于文件上传：如果你的应用程序不会使用到文件上传的特性，你可以编辑php.ini文件来禁止文件上传。<br />file_uploads=off<br />upload_max_filesize指令可以控制上传的单个文件最大值，以字节为单位。默认值为2M<br />post_max_size指令限制了当表单以POST方式提交的数据大小。通常情况下，这个值我们应该设置地比上面那个file_uploads稍微大一点点。如果你可能用到多文件上传，根据需要自行调整。默认值为8M。</p>
<p>(待补充。。。)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.terrysco.com/node/php-security-guide-2.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Architect&#8217;s Guide to PHP Security [1]</title>
		<link>http://www.terrysco.com/node/php-security-guide-1.html</link>
		<comments>http://www.terrysco.com/node/php-security-guide-1.html#comments</comments>
		<pubDate>Fri, 26 Sep 2008 03:29:55 +0000</pubDate>
		<dc:creator>terrysco</dc:creator>
				<category><![CDATA[Book Remarks]]></category>
		<category><![CDATA[Web Security]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://www.anyliv.com/www.terrysco.com/?p=42</guid>
		<description><![CDATA[<p>这几天稍微轻松点，就再看了一次PHP Architect's Guide to PHP Security这本经典PHP安全书籍。其中整理了一些笔记之类的东西，分享给大家。都是个人组织和翻译的东西，如果有不周到的地方还请广大安全爱好者给出批评和指正。本来想逐字翻译全文，但是这是一个浩大的工程，并且学习意义不大，所以挑选一些重要的内容进行翻译和注释。</p><p style="text-align: center;"><img title="" alt="" src="http://www.terrysco.com/upload/200809261133336667.gif" onload="ResizeImage(this,520)" /></p><p>...</p>
]]></description>
			<content:encoded><![CDATA[<p>这几天稍微轻松点，就再看了一次PHP Architect&#8217;s Guide to PHP Security这本经典PHP安全书籍。其中整理了一些笔记之类的东西，分享给大家。都是个人组织和翻译的东西，如果有不周到的地方还请广大安全爱好者给出批评和指正。本来想逐字翻译全文，但是这是一个浩大的工程，并且学习意义不大，所以挑选一些重要的内容进行翻译和注释。</p>
<p style="text-align: center;"><img class="size-full wp-image-191 aligncenter" title="200809261133336667" src="http://www.terrysco.com/wp-content/uploads/2008/09/200809261133336667.gif" alt="200809261133336667" width="180" height="220" /></p>
<p style="text-align: center;"><img src="http://www.terrysco.com/upload/200809261133336667.gif" alt="" /></p>
<p>前言和介绍就略过不翻译了，作者描述了一下PHP安全的重要性，以及为何变得如此重要。我想目前线上的很多php站点遭到攻击和破坏足以说明这点了，我们直接来看第一章Input Validation。今天先写前半章吧。（一章内容太多，本人英文比较菜，看完需要差不多3个小时）<span id="more-42"></span></p>
<p>该次翻译的内容列表：</p>
<ol>
<li>The Trouble with Input. （输入的问题）</li>
<li>The Constant Solution （常量解决方案）</li>
<li>The $_QEGUEST Trojan Horse （$_REQUEST木马）</li>
<li>Validating Input （输入验证）</li>
<li>Validating Numeric Data （数字验证）</li>
<li>Locale Troubles （Locale问题）</li>
<li>String Validation （字符串验证）</li>
<li>Content Size Validation （内容长度验证）</li>
</ol>
<p>这章简介中作者用斜体标注出了这么一句话：<em>It is absolutely imperative to validate all user input to ensure it matches the expected form.</em><br />
为了确保数据是我们期望的，必须验证所有的用户输入，即那句话：“永远不要信任外部数据”。</p>
<p>紧接着作者讲解了magic quotes gpc出现的历史，跟早起的版本相比较，是简化了开发者的工作，也增加了安全性。因为对外部来的数据不再对来源污染了，我们可以很清楚的知道数据的来源。这里作者给出一个例子：</p>
<p>if (is_authorized_user())<br />
define(‘auth’, TRUE);<br />
if (auth) // will always be true, either Boolean(TRUE) or String(“auth”)<br />
/* display content intended only for authorized users */<br />
为了“安全”，该程序将auth这个值设置为常量，避免数据污染和没有初始化带来的数据覆盖。但是，PHP中对于一个字符串，如果没有用引号包含起来，会当作常量处理，如果没有这个常量，将作为字符串处理。所以这里的auth放在if语句中就算没有define，也是成立的，因为他是一个字符串。这时只会给出一个notice的错误，不影响程序的执行，并且一般上线的站点，都会把display_errors关掉，根本不会提示。这里作者顺带提及了一个变量覆盖的问题，gpc_order指令可以设置优先级。并给出一个原则：尽量对所有变量进行初始化。</p>
<p>接下来，Validating Numeric Data这个小节说明对数字进行验证和处理最好的办法就是用int或float进行强制转换，比如：</p>
<p>$_GET[‘product_id’] = (int) $_GET[‘product_id’];<br />
$_GET[‘price’] = (float) $_GET[‘price’];</p>
<p>这里注意一点，如果我们用is_numeric函数对8进制数字进行判断时，不一定返回的就是我们需要的结果。is_numeric(“0955”);返回的是true，但显然这不是一个有效的8进制数值。</p>
<p>接着作者说明了local对验证的影响，这里不再详述，只要使用setlocale语法就可以了。</p>
<p>关于字符串的验证，一般使用的是ctype类函数，不过这些函数局限性也很大，比如认为－，空格等字符是非法的，再加上ctype是一个独立的扩展，有可能服务器上并没有安装该扩展或者被屏蔽，而且只能用在单字节字符集，所以最好的替代方案就是使用正则表达式（比如ereg函数）。Alas, regular expressions aren’t exceptionally fast and validating large strings of data may take noticeable amount of time. But, safety must come first. 正则表达式不是特别快，当对比较长的字符串数据进行验证的时候，会占用很明显不少的时间。但是，安全第一。</p>
<p>这篇文章最后，说下内容长度验证的问题：</p>
<p>表单中，只有text和password类型的控件可以使用maxlength属性设置最大长度，如果我们想在textarea中限制长度，可以使用下面这小段js做到。</p>
<p>&lt;form onSubmit=”if (this.biography.value.length &gt; 255) {<br />
alert(‘Keep it short, eh?’)<br />
return false;<br />
}”&gt;<br />
&lt;textarea name=”biography”&gt;&lt;/textarea&gt;&lt;input type=”submit”&gt;<br />
&lt;/form&gt;<br />
提交表单时候，用javascript判断这个textarea的长度是否大于255。不过任何form中的限制和js做的限制都不是一劳永逸的，If JavaScript and HTML can be circumvented, server-side PHP provides the real stopgap.</p>
<p>$form_fields = array(“Fname”=&gt;50, “Lname”=&gt;100, “Address”=&gt;255, /* . . . */);<br />
foreach ($form_fields as $k =&gt; $v)<br />
if (!empty($_POST[$k]) &amp;&amp; strlen($_POST[$k]) &gt; $v)<br />
exit(“{$k} is longer then the allowed {$v} byte length.”);<br />
必须用服务器端脚本进行验证，比如上述php代码则可以完成。</p>
<p>此外，如果你是一个对效率要求很苛刻的人，strlen会觉得影响速度，没关系，可以试试下面这个方法：</p>
<p>$form_fields = array(“Fname”=&gt;50, “Lname”=&gt;100, “Address”=&gt;255, /* . . . */);<br />
foreach ($form_fields as $k =&gt; $v) {<br />
if (!empty($_POST[$k]) &amp;&amp; isset($_POST[$k]{$v + 1})) {<br />
exit(“{$k} is longer then the allowed {$v} byte length.”);<br />
}<br />
}<br />
在PHP4.3.10后，可以对字符串使用isset控制，Because isset() is a language construct, it’s converted to a single instruction by Zend’s PHP parser and takes virtually no time to execute. 因为isset是一个语言结构，这样会加快执行的速度。似乎有点吹毛求疵，不过这正是我们狼族小四此等人的目的:-）</p>
<p>今天先写到这里吧，可能翻译整理得比较笼统，剩下的东西大都是解释型的句子，我想大部分人都很了解了吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.terrysco.com/node/php-security-guide-1.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

