0x01 前言

今天在对daloRADIUS的登录页和逻辑进行梳理,深深感到PHP的伟大与快捷。虽然我喜欢的是Python,但也被PHP深深地吸引住了。

其实今天我主要解决两个问题一个是选择列表(<select> 标签)的跳转与传值,另一个是session的写入问题。很多时间我都用来梳理愿编写者所写的逻辑,其实上述问题一点都不难!

0x02 选择列表的跳转与传值

0x02.1 构建列表

代码很简单,这是一个语言选择列表,如下:

<select class="form-control">
    <option value="en_US">
        English (United States)
    </option>
    <option value="zh_CN">
        Chinese (PRC)
    </option>
</select>

0x02.2 传值

因为需要将用户选择的语言写入到session,所欲需要跟随用户名和密码一起传送到下一步,HTML代码如下:

/*
    action 指定提交表单后对提交内容进行处理的脚本位置
    method 指定数据提交的方式
    name 规定表单的名称,如果你需要传值,通过PHP或其他语言获取内容,就需要定义name
    value 传送到处理脚本的值
*/
<form action="dologin.php" method="post">
    <select name="locale">
        <option value="en_US">
            English (United States)
        </option>
        <option value="zh_CN">
            Chinese (PRC)
        </option>
    </select>
    <button type="submit">
        Sign in
    </button>
</form>

有了前端HTML用来给用户选取,还需要后端的PHP脚本来处理用户提交的内容,脚本如下:

//获取值,可能是en_US,也有可能是zh_CN。
$_POST["locale"]

//将值赋予变量$locale,方便后续使用
$locale = $_POST["locale"];

0x02.3 跳转

其实传值是基础的一步,然而默认语言是英语,用户首次打开页面时还没对语言作出选择,也没有语言记录的session信息,一般用户会选择自己熟悉的语言(若需要的语言存在)。选择之后的文字并不会自动更新,需要自动或手动刷新。既然要刷新,为什么不自动刷新呢?

我并不熟悉JS,经过一个下午的摸索,终于明白了其中的奥妙,代码如下:

<script type="text/javascript">
	//定义函数名
    function gotolocale() {
    	/*
    	定义变量locale
    	document 接口对 DOM Document 接口进行了扩展,定义 HTML 专用的属性和方法;
    	.getElementById 是 document 对象方法;
    	value 是对象的值.
    	*/
    	//下面这句的意思是:获取第一个id名为locale对象的值,并将值赋予locale
		var locale = document.getElementById("locale").value;
		/*
			window 对象表示一个浏览器窗口或一个框架;
			location 是 window 对象方法;
			href 是 location 的属性
			"?locale=" 是一段字符串,双引号内的内容将完整输出
			+ 将前后两段内容接合
			locale 是上面所定义的变量locale
		*/
		//下面这句的意思是:将浏览器窗口(当前的)重定向至 ?locale=[变量locale]
		//地址可能是: foo.com/index.php?locale=zh_CN
		window.location.href = "?locale=" + locale;
	}
</script>

/*
	id 给列表赋予一个id,方便JS调用
	onChange 监测列表的更改,一旦更改则调用gotolocale()函数
*/

<form action="dologin.php" method="post">
    <select name="locale" id="locale" onChange="gotolocale()">
        <option value="en_US">
            English (United States)
        </option>
        <option value="zh_CN">
            Chinese (PRC)
        </option>
    </select>
    <button type="submit">
        Sign in
    </button>
</form>

这真的是很奇妙,当用户选择非默认的语言时,onChange 会监测到选项的改变而调用gotolocale() 函数。

gotolocale()函数是JavaScript,通过调用JS的一系列对象与属性,自动获取列表中的值,并通过编写好的格式构造链接,然后自动刷新浏览器当前的窗口。

真是太奇妙了!

其实JS和其他很多语言都类似,例如:window.location.href,window是一个函数,而location是他的一个实现方式或属性,同样的href也是location的一个实现方式或属性。

而这和Python太像了!

0x03 PHP session 的写入

其实将一个值写入session并不复杂,难得是怎样建立一个独一无二的session,代码如下:

//获取用户的IP地址
$REMOTE_ADDR = $_SERVER['REMOTE_ADDR'];

//产生一个1到9的随机整数,包括1和9
$rand = rand(1, 9);

//substr是获得字符串的子串,
//    substr(md5($REMOTE_ADDR), 0, 11 + $rand)的意思是:
//    将远程用户的IP地址进行MD5计算,并截取从第一个字符开始到[11+$rand]这一段字符串
//    例如:$rand = 8, 用户IP是:1.1.1.1 ,那么IP的MD5是:e086aa137fa19f67d27b39d0eca18610,
//        那么下面的substr就是截取上面MD5的第1位字符到第20位字符的内容,注意第一位字符是0!
//下面这一整句的意思是:随机数与substr所截取的字符串相结合并赋予变量session_id
$session_id = $rand . substr(md5($REMOTE_ADDR), 0, 11 + $rand);

//session_id()不但可以获取当前的session id,还可以将值赋予session_id
session_id($session_id);

//启动新会话或者重用现有会话
session_start();

//从上面所提交的内容里获取语言,zh_CN 或en_US
$locale = $_POST["locale"];

//在当前session建立一个名为locale的区域,并将语言的值赋予session的locale
$_SESSION['locale'] = $locale;

0x04 结语

这一切都很有趣,无论是写代码还是探索的过程,都能让你进步。有问题给我留言,我会尽可能为你解答。

0x05 相关信息