|
清单 12. 使用正则表达式和长度检查来限制 GET 变量
6t:x,O)k)e-eTechWeb-技术社区
9G T/w o"x4Ztech.techweb.com.cn<?phptech.techweb.com.cn9r.X"~+J5g'Z2k.g1s-Z
$pid = $_GET['pid'];
:W,h"g(m7j)Z+e']/wTechWeb-技术社区!Q2S!S*N7A
if (strlen($pid)){
:v%a#G3Q1b"v:~)H(S;_tech.techweb.com.cn if (!ereg("^[0-9]+$",$pid) && strlen($pid) > 5){tech.techweb.com.cn&Z6T!M5W(M0V*n
//do something appropriate, like maybe logging them out or sending them back to home page
3a1U)j-~#q%c7E6@&a }
0V3@9I*S;V!`:m*T0s/rtech.techweb.com.cn} else {程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛6?+w#t/b*P6S!Y7Y9x
//empty $pid, so send them back to the home page
9s'_7v(w6Y"C(]/h7B,l,W程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛}程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛(~0|!K%S R!N*q3K
//we create an object of a fictional class Page, which is nowTechWeb-技术社区!A.A*b7D"O.{1O7Z
//even more protected from evil user input$d7x1c"U'{;\
$obj = new Page;
2E,D h4N"f%D:PTechWeb-技术社区 $content = $obj->fetchPage($pid);7j5H(}6}.O7G7R!`$Q
//and now we have a bunch of PHP that displays the page程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛-^0_3E6b3p0R-\*C,I
?>
c8k$N6E:j5O程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛5}4{5y6i%C#q.z-[
现在,任何人都无法在数据库应用程序中塞进一个 5,000 位的数值 —— 至少在涉及 GET 字符串的地方不会有这种情况。想像一下黑客在试图突破您的应用程序而遭到挫折时咬牙切齿的样子吧!而且因为关闭了错误报告,黑客更难进行侦察。2^'x#o L0@&|-]8h
:W2N1O&N1O,l#Z程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛 $k1Q4V/o'r#{)v6m5i8b
2J-V9]+e(a+]:M;o$Y
TechWeb-技术社区4[:n-u3L2V)P }9F
缓冲区溢出攻击TechWeb-技术社区*v4U1I"A-q;^
$S Q"H.~ Q1f$f#n$^程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛缓冲区溢出攻击 试图使 PHP 应用程序中(或者更精确地说,在 Apache 或底层操作系统中)的内存分配缓冲区发生溢出。请记住,您可能是使用 PHP 这样的高级语言来编写 Web 应用程序,但是最终还是要调用 C(在 Apache 的情况下)。与大多数低级语言一样,C 对于内存分配有严格的规则。
&P0v%t'O8\$m+u&G6R程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛
7M6j'S%L'r:c&Z:y#F缓冲区溢出攻击向缓冲区发送大量数据,使部分数据溢出到相邻的内存缓冲区,从而破坏缓冲区或者重写逻辑。这样就能够造成拒绝服务、破坏数据或者在远程服务器上执行恶意代码。tech.techweb.com.cn1v2P0W/|;`7d6S
"|0o$N#F/Q"n.e
防止缓冲区溢出攻击的惟一方法是检查所有用户输入的长度。例如,如果有一个表单元素要求输入用户的名字,那么在这个域上添加值为 40 的 maxlength 属性,并在后端使用 substr() 进行检查。清单 13 给出表单和 PHP 代码的简短示例。
1@&E:e$k,n#u9K'^([,E \*x/a3Z5R
清单 13. 检查用户输入的长度程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛7k0[3V2W(B2d!S
7t*X9\#`9e,?'p程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛<?php
5~'x7i0M6i;Q5o A7x3FTechWeb-技术社区if ($_POST['submit'] == "go"){
2_&@.M6V0CTechWeb-技术社区 $name = substr($_POST['name'],0,40);
3{3?.Q&C&~%P%tTechWeb-技术社区}-H9V9^2D+_3W7|'n't
?>TechWeb-技术社区,_8f5U5G5d2E'H.g
!a"X:e;L,X(y!L
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛#H"l+j6\'b)m/f.a8J
<p><label for="name">Name</label>TechWeb-技术社区5p1O8o7Z5G%]&o%X&d1~ k
<input type="text" name="name" id="name" size="20" maxlength="40"/></p>
+d!B0n*J8s%D<p><input type="submit" name="submit" value="go"/></p>9Y2R0x1o!Q5R9H+{
</form>程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛/}-z/l'a-i:B,D
,u8q;L*I0p"B1c
为 什么既提供 maxlength 属性,又在后端进行 substr() 检查?因为纵深防御总是好的。浏览器防止用户输入 PHP 或 MySQL 不能安全地处理的超长字符串(想像一下有人试图输入长达 1,000 个字符的名称),而后端 PHP 检查会确保没有人远程地或者在浏览器中操纵表单数据。
']1T$s3[4w$d
8f"Z-l.|;g1i%C!M3n$\ Stech.techweb.com.cn正如您看到的,这种方式与前一节中使用 strlen() 检查 GET 变量 pid 的长度相似。在这个示例中,忽略长度超过 5 位的任何输入值,但是也可以很容易地将值截短到适当的长度,如下所示:程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛%f$d1k,f+k8e,m2z5k1p8g'Q
tech.techweb.com.cn7d4O7]%v#J"r"c1z
清单 14. 改变输入的 GET 变量的长度tech.techweb.com.cn/A8^"k {:z-o#|
TechWeb-技术社区-m:H4~$G*E)}'_
<?php2Z4\)}*k6g#h;S4e
$pid = $_GET['pid'];TechWeb-技术社区7P&d;\.p,w#i
7w#c4`'i!bif (strlen($pid)){
.~1T1u%V1V%[;i'N if (!ereg("^[0-9]+$",$pid)){
#a1n+n;^;m;k0W$ltech.techweb.com.cn //if non numeric $pid, send them back to home pagetech.techweb.com.cn0x1^*?7S"p5d;v7e
}
*|"u b7_8D:q0l$htech.techweb.com.cn}else{程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛$V3{:Q8i;^4G*v!n
//empty $pid, so send them back to the home page%O0`(q/B'F0\9^.D8Y
}
1K:o ~ O0L$\3k"p
:S2m8j:S4o%RTechWeb-技术社区 //we have a numeric pid, but it may be too long, so let's check
'G&y%P0{*f:s"p程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛 if (strlen($pid)>5){7j*l$Q;p5y6s
$pid = substr($pid,0,5);%r1a;x$C,c7M#s4F
}+Z%A,z(D&W
2{:D7};t3K
//we create an object of a fictional class Page, which is now
-F0?*_:f(p;X%R)a-j程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛 //even more protected from evil user input
6A+G#v"c#w$j9E,f4{8w(DTechWeb-技术社区 $obj = new Page;
(l'o'h+Z!}7g A$o c $content = $obj->fetchPage($pid);
3V3[!K0o9}"u#t7A-l2m //and now we have a bunch of PHP that displays the page)c A/H,R5D5s9[3d1s;?
?>8l;Y:_,C7w.g
TechWeb-技术社区4J"|1M+G&a-J6G&B
注 意,缓冲区溢出攻击并不限于长的数字串或字母串。也可能会看到长的十六进制字符串(往往看起来像 \xA3 或 \xFF)。记住,任何缓冲区溢出攻击的目的都是淹没特定的缓冲区,并将恶意代码或指令放到下一个缓冲区中,从而破坏数据或执行恶意代码。对付十六进制缓 冲区溢出最简单的方法也是不允许输入超过特定的长度。#c8e*R%P"v)s0@#_9Q
)M7v$f#j5m4D7j;Z+y如果您处理的是允许在数据库中输入较长条目的表单文本区,那么无法在客户端轻松地限制数据的长度。在数据到达 PHP 之后,可以使用正则表达式清除任何像十六进制的字符串。
8_ T0d/x"J
.u*B/W.R$t)c3b$hTechWeb-技术社区清单 15. 防止十六进制字符串TechWeb-技术社区"x:S D;f(|"C,t0t
7B+^'D$G$]4c.t'qtech.techweb.com.cn<?php
9Q C5n,L!Etech.techweb.com.cnif ($_POST['submit'] == "go"){tech.techweb.com.cn q&p%w;g'O
$name = substr($_POST['name'],0,40);
1q-N:m'z"l!}4o-O g //clean out any potential hexadecimal characters9r%n8g1N9_
$name = cleanHex($name);tech.techweb.com.cn*k8_+C:R4F-?7T:t#x
//continue processing....%Q$^!i4@8K%T u"y-S,z
}tech.techweb.com.cn&q.V1@8D!E#z"i&Y
&G4a&R(M6ktech.techweb.com.cnfunction cleanHex($input){:q'g$g!~0]!b
$clean = preg_replace("![\][xX]([A-Fa-f0-9]{1,3})!", "",$input);tech.techweb.com.cn+v,[9]%w0@'v;D&c7J,[;@
return $clean;
3g-h8y.J0L)P#}.z$M}+j!e(s8w%z7y(|
?>TechWeb-技术社区7R'i8i*M*A'O-\
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">$y1A:\)n8m+{2m(l
<p><label for="name">Name</label>TechWeb-技术社区-Y0K*^*m2{-^2U%\(b"Q
<input type="text" name="name" id="name" size="20" maxlength="40"/></p>(|/a8A(Y3U6~4A"Y
<p><input type="submit" name="submit" value="go"/></p>
5l K7i.o2a.p.Q,B"Rtech.techweb.com.cn</form>程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛(X/_1{ ?7I(G$z$C
1s/n4|*j g5q*d
您 可能会发现这一系列操作有点儿太严格了。毕竟,十六进制串有合法的用途,比如输出外语中的字符。如何部署十六进制 regex 由您自己决定。比较好的策略是,只有在一行中包含过多十六进制串时,或者字符串的字符超过特定数量(比如 128 或 255)时,才删除十六进制串。
/U:g C,c6F9N L'[9Q8I8e!Mtech.techweb.com.cn
#b.w-R+S |7h5I'bTechWeb-技术社区 TechWeb-技术社区,B#x!c"\6M2l:}1E
TechWeb-技术社区.Q#W$g']#k9C0l
0R#_ z8a%S7T!etech.techweb.com.cn跨站点脚本攻击程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛-|1c0O2E*L
TechWeb-技术社区&^6H%V/l&h7b!e9G/~/b
在跨站点脚本(XSS)攻击中,往往有一个恶意用户在表单中(或通过其他用户输入方式)输入信息,这些输入将恶 意的客户端标记插入过程或数据库中。例如,假设站点上有一个简单的来客登记簿程序,让访问者能够留下姓名、电子邮件地址和简短的消息。恶意用户可以利用这 个机会插入简短消息之外的东西,比如对于其他用户不合适的图片或将用户重定向到另一个站点的 Javascrīpt,或者窃取 cookie 信息。
8J3m.I"F+J6K
,X;@/m%s3s"y5q%A程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛幸运的是,PHP 提供了 strip_tags() 函数,这个函数可以清除任何包围在 HTML 标记中的内容。strip_tags() 函数还允许提供允许标记的列表,比如 <b> 或 <i>。
$}1E!}8]4B9D7h!L
)r6O.I+n,H8X-u v程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛浏览器内的数据操纵
(Z%~6E/J0C,N+P&Z(@!d6C6p;`2}8r*K!C;W'F2A
有一类浏览器插件允许用户篡改页面上的头部元素和表单元素。使用 Tamper Data(一个 Mozilla 插件),可以很容易地操纵包含许多隐藏文本字段的简单表单,从而向 PHP 和 MySQL 发送指令。
s:w"Y0q)C/X9z
0u.~:r(l6\/N9S8C用户在点击表单上的 Submit 之前,他可以启动 Tamper Data。在提交表单时,他会看到表单数据字段的列表。Tamper Data 允许用户篡改这些数据,然后浏览器完成表单提交。
8N'P,u'A)@%n(O5V2v程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛6w-J'}1D0g9|
让我们回到前面建立的示例。已经检查了字符串长度、清除了 HTML 标记并删除了十六进制字符。但是,添加了一些隐藏的文本字段,如下所示:
8d#C)U1M y&}/]8i;G9o-N
*h,L6{4_8R(H,D5M+g/hTechWeb-技术社区清单 17. 隐藏变量 D.k*b*n:v+Z$E5S
;G+z"t1e7\(W C3H
<?php(f$H8o*B;z5t
if ($_POST['submit'] == "go"){tech.techweb.com.cn$^#\"e'Z:~
//strip_tags-a9t0a:b+Q$_,A r8q
$name = strip_tags($_POST['name']);%f;n$j*t+|*F
$name = substr($name,0,40);
7@3B%y']:K:m%A:N"?(@程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛 //clean out any potential hexadecimal characters!o"}4}4P7M:?!O"k7]2A
$name = cleanHex($name);tech.techweb.com.cn:M9|#e3H/M%y
//continue processing....
1x4S,N;h2F%{0|!\1J程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛}
4o)T5g,{9v(b;a)}&V.d#Q)e%O;p8I%o
function cleanHex($input){
-s;o;y'D(^-R&L.L/m#h $clean = preg_replace("![\][xX]([A-Fa-f0-9]{1,3})!", "",$input);
7u0[*v9M.g;o!^!hTechWeb-技术社区 return $clean;9B)`)^6k"S%b7h*?"~
}
-r)B8m#u#x:H2~+Y?>程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛(r;q0O1x#x3~
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
%@.c2a!p;A9O,C7c$R程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛<p><label for="name">Name</label>,r6y"B.L V
<input type="text" name="name" id="name" size="20" maxlength="40"/></p>
'a#@+F2e-E,I#g8Ftech.techweb.com.cn<input type="hidden" name="table" value="users"/>TechWeb-技术社区5i0j1t+r6q(u,O
<input type="hidden" name="action" value="create"/>程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛9n6e0L:W!{5\9O5k)o8h)g#W
<input type="hidden" name="status" value="live\"/>
/M%G(O*S7p/^3\0o<p><input type="submit" name="submit" value="go"/></p>TechWeb-技术社区1U8[%I'B)N%l0U
</form>5q4l;f4G8]7w*r1k;J5B
9G9L#e2f7t7_&I%m注意,隐藏变量之一暴露了表名:users。还会看到一个值为 create 的 action 字段。只要有基本的 SQL 经验,就能够看出这些命令可能控制着中间件中的一个 SQL 引擎。想搞大破坏的人只需改变表名或提供另一个选项,比如 delete。
|