2010-09-16 140 views
3

Apols如果此前已被询问。我使用别人的PHP代码和整个以下行来了:{0}在PHP语句中的含义是什么?

if($_GET['file']{0}=='.') die('Wrong file!'); 

的如果,$ _ GET和死我理解,但究竟是什么意思{0}的$ _GET后[“文件”] ?我浏览了一些教程,没有看到答案。

TIA。

回答

11

$str{0}将返回字符串的第一个字符/字节。但the syntax $str{0} is deprecated in favor of $str[0]

注:字符串也可以使用大括号访问,如$str{42},为了同样的目的。但是,从PHP 5.3.0起,此语法已弃用。改用方括号,如$str[42]

如果您使用的是多字节字符,请改为使用mb_substr

+4

+1表示已被弃用。 **请勿使用此通知!** – NikiC 2010-09-16 14:48:18

+0

Thx用于全面回答问题。 – SteveWilkinson 2010-09-16 20:10:46

+0

**如果你想要使用这个符号!**(不要总是相信你在手册中读到的内容):-) – salathe 2010-09-28 21:24:50

5

{0}[0]相同。因此,$_GET['file']{0}正在从$_GET['files']获得第零个字符。

+0

不正确;你听起来像[]和{}是一样的。他们不是。 {}是一个字符串索引 - 即字符串位置x处的字符。 – Spudley 2010-09-16 14:48:01

+3

''''和'{}'是一样的!请参阅:http://ideone.com/fG7nD – 2010-09-16 14:50:34

+0

人们可以删除downvotes吗? – 2010-09-16 14:54:22

4

这是访问字符串的第一个字符的简写。 $ _GET ['file'] {1}将是第二个字符,依此类推。所以在你的例子中,它检查第一个字符是否是一个点,如果是,退出;大概是为了避免人们在URL中传递路径,如../../../etc/passwd。

+0

但请记住,这个“检查”是不够的。一个可以直接使用“/ etc/passwd”,并且有多种文件系统的攻击向量。请参阅http://www.evilaliv3.org/articles/php-filesystem-attack-vectors/ – 2010-09-16 15:00:56

+0

感谢您的解释Tim和为链接1月 – SteveWilkinson 2010-09-16 20:06:20

1

正如其他人所说,它正在查看$ _GET ['file']变量中的字符串位置0,并在出现错误时抛出一个错误。

这看起来像是一种防止黑客攻击的方法(通过阻止用户访问以点开头的文件)。

+0

感谢您解释检查的重点 - 也是一个谜。 – SteveWilkinson 2010-09-16 20:05:14

相关问题