<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-cn">
		<id>http://wiki.tomtalk.net/index.php?action=history&amp;feed=atom&amp;title=PHP%E5%BC%80%E5%8F%91web%E5%BA%94%E7%94%A8%E5%AE%89%E5%85%A8%E6%80%BB%E7%BB%93</id>
		<title>PHP开发web应用安全总结 - 版本历史</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.tomtalk.net/index.php?action=history&amp;feed=atom&amp;title=PHP%E5%BC%80%E5%8F%91web%E5%BA%94%E7%94%A8%E5%AE%89%E5%85%A8%E6%80%BB%E7%BB%93"/>
		<link rel="alternate" type="text/html" href="http://wiki.tomtalk.net/index.php?title=PHP%E5%BC%80%E5%8F%91web%E5%BA%94%E7%94%A8%E5%AE%89%E5%85%A8%E6%80%BB%E7%BB%93&amp;action=history"/>
		<updated>2026-04-24T10:05:31Z</updated>
		<subtitle>本wiki的该页面的版本历史</subtitle>
		<generator>MediaWiki 1.24.2</generator>

	<entry>
		<id>http://wiki.tomtalk.net/index.php?title=PHP%E5%BC%80%E5%8F%91web%E5%BA%94%E7%94%A8%E5%AE%89%E5%85%A8%E6%80%BB%E7%BB%93&amp;diff=4522&amp;oldid=prev</id>
		<title>Tom：/* PHP开发web应用安全总结 */</title>
		<link rel="alternate" type="text/html" href="http://wiki.tomtalk.net/index.php?title=PHP%E5%BC%80%E5%8F%91web%E5%BA%94%E7%94%A8%E5%AE%89%E5%85%A8%E6%80%BB%E7%BB%93&amp;diff=4522&amp;oldid=prev"/>
				<updated>2016-08-27T02:49:31Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;PHP开发web应用安全总结&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;;XSS跨站脚本&lt;br /&gt;
&lt;br /&gt;
概念：恶意攻击者往Web页面里插入恶意html代码，当用户浏览该页之时，嵌入其中Web里面的html代码会被执行，从而达到恶意用户的特殊目的。&lt;br /&gt;
&lt;br /&gt;
危害：&lt;br /&gt;
&lt;br /&gt;
盗取用户COOKIE信息。&lt;br /&gt;
跳转到钓鱼网站。&lt;br /&gt;
操作受害者的浏览器，查看受害者网页浏览信息等。&lt;br /&gt;
蠕虫攻击。&lt;br /&gt;
描述：反射型跨站。GET或POST内容未过滤，可以提交JS以及HTML等恶意代码。&lt;br /&gt;
&lt;br /&gt;
代码：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php echo $_GET['msg']; ?&amp;gt;&lt;br /&gt;
//正常URL&lt;br /&gt;
user.php?msg=henhao&lt;br /&gt;
//带JS的URL&lt;br /&gt;
user.php?msg=&amp;lt;script&amp;gt;alert(1)&amp;lt;/script&amp;gt;&lt;br /&gt;
//恶意跳转URL&lt;br /&gt;
user.php?msg=&amp;lt;script&amp;gt;window.history.back(-1);&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解决方法：&lt;br /&gt;
&lt;br /&gt;
输出过滤，php端输出到view的模板页面上的数据都需要经过过滤：&lt;br /&gt;
&lt;br /&gt;
//输出过滤HTML JS标签&lt;br /&gt;
$var = str_replace(array('&amp;lt;iframe','&amp;lt;meta','&amp;lt;script'), '', $var); $var = str_replace(array('..',')','&amp;lt;','='), array('..',')','&amp;lt;','='), $var);  &lt;br /&gt;
$var = addslashes($var); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;CSRF跨站攻击&lt;br /&gt;
概念：CSRF跨站请求伪造，也被称成为“one click attack”或者session riding，通常缩写为CSRF或者XSRF，是一种对网站的恶意利用。XSS利用站点内的信任用户，而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比，CSRF攻击往往不大流行（因此对其进行防范的资源也相当稀少）和难以防范，所以被认为比XSS更具危险性。&lt;br /&gt;
&lt;br /&gt;
危害：强迫受害者的浏览器向一个易受攻击的Web应用程序发送请求,最后达到攻击者所需要的操作行为。&lt;br /&gt;
&lt;br /&gt;
例子：&lt;br /&gt;
&lt;br /&gt;
1. 上面是一个图片的html标签，但是src中是一个添加id为123好友的新增好友链接。&lt;br /&gt;
&lt;br /&gt;
2. 恶意用户可以将这段代码植入其它网站网页上面，甚至可以img设置为0,0，让用户不知不觉中点击这个链接，达到用户并不像加这个人好友，但是添加的目的。&lt;br /&gt;
&lt;br /&gt;
3. 当很多人都无意加了id为123这个人为好友的时候，id为123的恶意用户就有权限来查看这些人的信息，甚至可以发送很多恶意的信息，达到恶意用户的目的。&lt;br /&gt;
&lt;br /&gt;
解决方法：&lt;br /&gt;
&lt;br /&gt;
1. http://a.com/addfriend.php?id=123 使用POST方法会相对安全一点。&lt;br /&gt;
&lt;br /&gt;
2. 采用类似随即码或者令牌的形式，让用户操作唯一性。 （每次用户登录网站随机生成一个token，存放在cookie中，用户的所有操作中都需要经过token验证）&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;flash安全问题&lt;br /&gt;
例子：&lt;br /&gt;
&lt;br /&gt;
http://images.sohu.com/bill/s2010/liulin/nokia/1602600902.swf?clickthru=javascript:alert(1)&lt;br /&gt;
&lt;br /&gt;
解决方法：&lt;br /&gt;
&lt;br /&gt;
在网站根目录中，添加crossdomain.xml文件，这个文件主要是控制flash的域访问。&lt;br /&gt;
&lt;br /&gt;
淘宝的：http://www.taobao.com/crossdomain.xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;  &lt;br /&gt;
&amp;lt;cross-domain-policy&amp;gt;  &lt;br /&gt;
&amp;lt;allow-access-from domain=&amp;quot;*.taobao.com&amp;quot; /&amp;gt;  &lt;br /&gt;
&amp;lt;allow-access-from domain=&amp;quot;*.taobao.net&amp;quot; /&amp;gt;  &lt;br /&gt;
&amp;lt;allow-access-from domain=&amp;quot;*.taobaocdn.com&amp;quot; /&amp;gt;  &lt;br /&gt;
&amp;lt;allow-access-from domain=&amp;quot;*.tbcdn.cn&amp;quot; /&amp;gt;  &lt;br /&gt;
&amp;lt;allow-access-from domain=&amp;quot;*.allyes.com&amp;quot; /&amp;gt;  &lt;br /&gt;
&amp;lt;/cross-domain-policy&amp;gt; &lt;br /&gt;
&lt;br /&gt;
;sql注入安全问题&lt;br /&gt;
概念：所谓SQL注入，就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串，最终达到欺骗服务器执行恶意的SQL命令。&lt;br /&gt;
&lt;br /&gt;
危害：&lt;br /&gt;
&lt;br /&gt;
1. 查询数据库中敏感信息。&lt;br /&gt;
&lt;br /&gt;
2. 绕过认证。&lt;br /&gt;
&lt;br /&gt;
3. 添加、删除、修改服务器数据。&lt;br /&gt;
&lt;br /&gt;
4. 拒绝服务。?id=(BENCHMARK(100000000, MD5(RAND()));&lt;br /&gt;
&lt;br /&gt;
例子：&lt;br /&gt;
&lt;br /&gt;
$sql = &amp;quot;SELECT name FROM users WHERE id = '&amp;quot;. $_GET['id'] . &amp;quot;'&amp;quot;;&lt;br /&gt;
当ID值为：1’ or 1=’1  SQL语句(已测试可以注入)：&lt;br /&gt;
&lt;br /&gt;
SELECT name FROM users WHERE id = ‘1’ or 1=’1 ‘&lt;br /&gt;
说明：1=1的时候，条件语句WHEREOR之前的不起作用。 ‘的作用是组装SQL语句。&lt;br /&gt;
&lt;br /&gt;
解决方法：&lt;br /&gt;
&lt;br /&gt;
SQL组装的时候，对外部变量以及所有变量都进行过滤：&lt;br /&gt;
&lt;br /&gt;
PHPWIND中，可以用sqlEscape、sqlImplode、sqlSingle、sqlMulti等函数过滤组装。过滤主要是一些’单引号这些可以破坏SQL组装的数据。&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
* SQL组装-私有SQL过滤&lt;br /&gt;
* @param  string $val 过滤的值&lt;br /&gt;
* @param  int    $iskey 0-过滤value值，1-过滤字段&lt;br /&gt;
* @return string&lt;br /&gt;
*/&lt;br /&gt;
private function build_escape_single($val, $iskey = 0) {&lt;br /&gt;
if ($iskey === 0) {&lt;br /&gt;
if (is_numeric($val)) {&lt;br /&gt;
return &amp;quot; '&amp;quot; . $val . &amp;quot;' &amp;quot;;&lt;br /&gt;
} else {&lt;br /&gt;
return &amp;quot; '&amp;quot; . addslashes(stripslashes($val)) . &amp;quot;' &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
} else {&lt;br /&gt;
$val = str_replace(array('`', ' '), '', $val);&lt;br /&gt;
return ' `'.addslashes(stripslashes($val)).'` ';&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;XML注入安全问题&lt;br /&gt;
概念：和SQL注入原理一样，XML是存储数据的地方，如果在查询或修改时，如果没有做转义，直接输入或输出数据，都将导致XML注入漏洞。攻击者可以修改XML数据格式，增加新的XML节点，对数据处理流程产生影响。&lt;br /&gt;
&lt;br /&gt;
危害：&lt;br /&gt;
&lt;br /&gt;
1. 攻击者可以新增XML节点&lt;br /&gt;
&lt;br /&gt;
2. 破坏原来的XML结构，影响业务流程，甚至产生严重的错误。&lt;br /&gt;
&lt;br /&gt;
例子：&lt;br /&gt;
&lt;br /&gt;
$xml = &amp;quot;&amp;lt;USER role=guest&amp;gt;&amp;lt;name&amp;gt;“ . $_GET[‘name’] . &amp;quot;&amp;lt;/name&amp;gt;&amp;lt;email&amp;gt;“ . $_GET[‘email’] . &amp;quot;&amp;lt;/email&amp;gt;&amp;lt;/USER&amp;gt;&amp;quot;;&lt;br /&gt;
需要得到的XML结构：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;   &lt;br /&gt;
&amp;lt;USER role=guest&amp;gt;  &lt;br /&gt;
&amp;lt;name&amp;gt;user1&amp;lt;/name&amp;gt;  &lt;br /&gt;
&amp;lt;email&amp;gt;user1@a.com&amp;lt;/email&amp;gt;  &lt;br /&gt;
&amp;lt;/USER&amp;gt; &lt;br /&gt;
&lt;br /&gt;
恶意代码：&lt;br /&gt;
&lt;br /&gt;
user1@a.com&amp;lt;/email&amp;gt;&amp;lt;/USER&amp;gt;&amp;lt;USER role=admin&amp;gt;&amp;lt;name&amp;gt;test&amp;lt;/name&amp;gt;&amp;lt;email&amp;gt;user2@a.com &lt;br /&gt;
意外的XML文档：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;  &lt;br /&gt;
&amp;lt;USER role=guest&amp;gt;  &lt;br /&gt;
&amp;lt;name&amp;gt;user1&amp;lt;/name&amp;gt;  &lt;br /&gt;
&amp;lt;email&amp;gt;user1@a.com&amp;lt;/email&amp;gt;  &lt;br /&gt;
&amp;lt;/USER&amp;gt;  &lt;br /&gt;
&amp;lt;USER role=admin&amp;gt;  &lt;br /&gt;
&amp;lt;name&amp;gt;test&amp;lt;/name&amp;gt;  &lt;br /&gt;
&amp;lt;email&amp;gt;user2@a.com&amp;lt;/email&amp;gt;  &lt;br /&gt;
&amp;lt;/USER&amp;gt; &lt;br /&gt;
&lt;br /&gt;
解决方法：&lt;br /&gt;
&lt;br /&gt;
1. 对php处理XML文档的时候，进行标签过滤&lt;br /&gt;
2. 尽量减少直接被外部访问到xml文档，可以采用文件名用散列方法等。&lt;br /&gt;
&lt;br /&gt;
;url跳转漏洞&lt;br /&gt;
&lt;br /&gt;
概念：Web应用程序接收到用户提交的URL参数后，没有对参数做”可信任URL”的验证，就向用户浏览器返回跳转到该URL的指令。&lt;br /&gt;
&lt;br /&gt;
危害：钓鱼网站&lt;br /&gt;
&lt;br /&gt;
例子：&lt;br /&gt;
&lt;br /&gt;
http://m.yahoo.cn/log.php?c=web&amp;amp;u=http://www.163.com&lt;br /&gt;
&lt;br /&gt;
解决方法：&lt;br /&gt;
&lt;br /&gt;
对跳转的php函数进行进一步优化，使页面跳转可以在可信任的范围内。 例如可以有跳转域名白名单方法，这个访问各大公司使用比较多&lt;br /&gt;
&lt;br /&gt;
;系统命令漏洞&lt;br /&gt;
&lt;br /&gt;
概念：用户提交的参数用于执行系统命令的参数。&lt;br /&gt;
&lt;br /&gt;
#谨慎使用系统命令，对使用系统命令的地方需要进行安全评审&lt;br /&gt;
#对命令语句进行严格过滤&lt;br /&gt;
&lt;br /&gt;
;文件上传漏洞&lt;br /&gt;
&lt;br /&gt;
概念：Web应用程序在处理用户上传的文件时，没有判断文件的扩展名是否在允许的范围内，或者没检测文件内容的合法性，就把文件保存在服务器上，甚至上传脚本木马到web服务器上，直接控制web服务器。&lt;br /&gt;
&lt;br /&gt;
#使用安全的，可信任的上传组件。&lt;br /&gt;
#检查文件扩展名，保证文件的类型正确。&lt;br /&gt;
#检查文件内容，保证用户不伪造文件类型。&lt;br /&gt;
&lt;br /&gt;
;权限控制漏洞&lt;br /&gt;
&lt;br /&gt;
概念：属于业务逻辑上的安全管理。&lt;br /&gt;
&lt;br /&gt;
访问控制：&lt;br /&gt;
&lt;br /&gt;
#水平访问：Web应用程序接收到用户请求，修改某条数据时，没有判断数据的所属人，或判断数据所属人时，从用户提交的request参数（用户可控数据）中，获取了数据所属人id，导致恶意攻击者可以通过变换数据ID，或变换所属人id，修改不属于自己的数据。&lt;br /&gt;
#垂直访问：由于web应用程序没有做权限控制，或仅仅在菜单上做了权限控制，导致的恶意用户只要猜测其他管理页面的URL，就可以访问或控制其他角色拥有的数据或页面，达到权限提升目的。&lt;br /&gt;
&lt;br /&gt;
存在情况：&lt;br /&gt;
&lt;br /&gt;
#URL级别的。（例如论坛需要操作评分的时候，有一个提交的URL地址，该地址提交过去，如果不做权限判断，那么恶意用户就可以随意的拿这个URL地址来进行恶意行为）&lt;br /&gt;
#菜单级别。（会员中心或者后台管理中心，会有菜单，管理员可以看到多个功能，普通管理员只能看到一部分功能。但是如果你对管理员操作的功能区不做权限判断，那么普通管理员只要猜测或者获取管理区的URL，就可以进行管理员操作了）&lt;br /&gt;
&lt;br /&gt;
危害：&lt;br /&gt;
&lt;br /&gt;
属于业务逻辑的漏洞，这些危害性是巨大的，可以让普通用户就可能获取管理员的权限，对网站进行恶意破坏或者做非法行为。&lt;br /&gt;
&lt;br /&gt;
解决方案：&lt;br /&gt;
&lt;br /&gt;
#项目先期，做一份详细的权限规划文档。&lt;br /&gt;
#在开发中严格按照权限文档的要求去做权限。&lt;br /&gt;
#后期测试需要覆盖权限这一块功能区。&lt;br /&gt;
#程序员需要经常注意这些方面的要求。&lt;br /&gt;
&lt;br /&gt;
;cookie安全设置&lt;br /&gt;
&lt;br /&gt;
cookie httponly flag ： 在用到用户名登陆密码之类的安全性比较高的cookie的时候，可以在cookie中设置httponly属性，该属性只允许php等访问cookie，而不允许js访问。&lt;br /&gt;
&lt;br /&gt;
cookie secure flag ： 在涉及到https这样的情况，需要对cookie加密传输，那么可以设置这个属性&lt;br /&gt;
&lt;br /&gt;
;session安全&lt;br /&gt;
#SESSION是保存在服务器端的，具有比COOKIE一定的安全性。&lt;br /&gt;
#使用COOKIE的时候，如果长时间没有动作，可以设置一个时间值，来对COOKIE进行过期。&lt;br /&gt;
#尽量让用户每次的cookie值都是不同的，这样可以保证cookie被盗取也不能长期使用的问题。&lt;/div&gt;</summary>
		<author><name>Tom</name></author>	</entry>

	</feed>