本文原创作者:xiaoye,本文属i春秋原创奖励计划,未经许可禁止转载!
一、前言
最近在学代码审计,seay法师写的书相当不错,但是看到最后对复杂的php代码还是似懂非懂。。不深入了解一下php看来是不行了,这次先简单来一个留言板的开发,用它做php开发入门时不错的,因为用到了很多与数据库的交互,而后端最重要的就是这个。
最近在学代码审计,seay法师写的书相当不错,但是看到最后对复杂的php代码还是似懂非懂。。不深入了解一下php看来是不行了,这次先简单来一个留言板的开发,用它做php开发入门时不错的,因为用到了很多与数据库的交互,而后端最重要的就是这个。
二、目录
1.需求与功能分析
2.分离设计
3.整体实现
第一节:需求、功能分析
开发的第一步永远是分析,这次我们要开发的是留言板,需求:我们需要自己留言提交,然后显示在页面上;功能:用户输入的留言将插入到数据库里保存,之后通过数据库读取到页面来显示。好了,功能分析完了,我们需要两步:
1.构造一个表单,用户填入信息点击提交,数据插入到数据库
2.插入数据库的内容将被读取出来,显示到页面的一个表格中(因为是留言板,<table>表格比较整齐美观)
第二节:分离实现
把两个功能先各自实现:
1.
代码如下:
connmy.php(数据库连接文件,我单独写出来,其他的文件用include(connmy.php);来包含它)
[PHP] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
|
<?php $con = mysql_connect( 'localhost' , 'root' , 'root' ); //数据库连接 if (! $con ){ die ( '数据库连接错误' ); } mysql_select_db( 'lyb' , $con ); //选择数据库 mysql_query( "set names 'utf8'" ); ?> |
addmsgmy.php(将用户输入的数据接收并插入到数据库里):
[AppleScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
< ?php include ( 'connmy.php' ) ; if ( @$_POST['submit'] ) { / / 判断用户点击之后再执行sql语句防止post数据为空 $sql = "insert into lyb (id,user,title,content,lastdate) values ('','$_POST[user]','$_POST[title]','$_POST[content]',now())" ; mysql_query ( $sql ) ; / / 执行sql语句 echo '添加成功'; } ? > < script > / / 这段执行前端判断user , title , content 的条件 function check ( ) { if ( myform 1. user. value = = "" ) { alert ( '用户名不能为空' ) ; return false ; } if ( myform 1. title . value .length < 5 ) { alert ( '标题长大于 5 ' ) ; return false ; } if ( myform 1. content . value = "" ) { alert ( '内容不能为空' ) ; return false ; } } < / SCRIPT > < form action = ' ' method = 'POST' name = "myform1" > 用名: < input type = "text" name = "user" / > < br > 标题: < input type = "text" name = "title" / > < br > 内容: < textarea name = "content" cols = ' 60 ' rows = ' 9 ' > < / textarea > < br > < input type = 'submit' name = 'submit' value = 'submit' > < / form > |
表单就不用多说了,onsubmit=”return check();”,是用前端check()函数来进行用户输入是否符合规则的判断,不符合即onsubmit=”return false();”,表单即停止,不会发送入数据库。
上面的php代码接收用户post数据,并插入数据库lyb表段lyb中的相应字段中。
我输入了数据,看看数据库里有没有正确插入:
ok,成功了
2.数据库中数据读取,显示到页面的<table>中(留言板用table显示比较整齐美观)
showmsgmy.php:
[AppleScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
< ?php include ( 'connmy.php' ) ; ? > < table width = 500 border = "0" align = "center" cellpadding = "5" cellspacing = "1" > < ?php $sql = "select * from lyb order by lastdate desc" ; $ result = mysql_query ( $sql ) ; while ( $row = mysql_fetch_array ( $ result ) ) { ? > < tr bgcolor = "#eff3ff" > < big > < b > < td > 标题: < ? = $row[' title ']? > < / td > < / b > < / big > < td > 用户: < ? = $row['user']? > < / td > < td > 时间: < ? = $row['lastdate']? > < / td > < / tr > < tr bgColor = "#ffffff" > < td > 内容: < ? = $row[' content ']? > < / td > < / tr > < ?php } ? > < / table > |
核心代码:
[AppleScript] 纯文本查看 复制代码
1
2
3
4
5
|
< ?php $sql = "select * from lyb order by lastdate desc" ; $ result = mysql_query ( $sql ) ; while ( $row = mysql_fetch_array ( $ result ) ) { ? > |
从数据库中按lastdate降序取出数据,注意mysql_fetch_array是一条一条执行的,所以需要while循环来遍历所有数组,这段采用了php html混编的写法,使tb标签中能直接输出php代码的执行结果:如<?= $row[‘lastdate’]?>就会输出$row数组的lastdate段的结果
第三节:整体实现
这块没有多少技术含量了,把showmsgmy.php代码内容放到addmsgmy.php的前面即可,但是注意一点:
这个地方加上header(),header()是用来在用户执行点击操作后,刷新页面的,否则刚刚插入的数据不能及时显示出来
最后的整体代码如下(别忘了还有connmy.php):
[AppleScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
< ?php include ( 'connmy.php' ) ; ? > < table width = 500 border = "0" align = "center" cellpadding = "5" cellspacing = "1" > < ?php $sql = "select * from lyb order by lastdate desc" ; $ result = mysql_query ( $sql ) ; while ( $row = mysql_fetch_array ( $ result ) ) { ? > < tr bgcolor = "#eff3ff" > < big > < b > < td > 标题: < ? = $row[' title ']? > < / td > < / b > < / big > < td > 用户: < ? = $row['user']? > < / td > < td > 时间: < ? = $row['lastdate']? > < / td > < / tr > < tr bgColor = "#ffffff" > < td > 内容: < ? = $row[' content ']? > < / td > < / tr > < ?php } ? > < / table > < ?php include ( 'connmy.php' ) ; if ( @$_POST['submit'] ) { $sql = "insert into lyb (id,user,title,content,lastdate) values ('','$_POST[user]','$_POST[title]','$_POST[content]',now())" ; mysql_query ( $sql ) ; echo '添加成功'; header ( "Location:/super.php" ) ; } ? > < SCRIPT language = javascript > function check ( ) { if ( myform 1. user. value = = "" ) { alert ( '用户名不能为空' ) ; return false ; } if ( myform 1. title . value .length < 5 ) { alert ( '标题长大于 5 ' ) ; return false ; } if ( myform 1. content . value = = "" ) { alert ( '内容不能为空' ) ; return false ; } } < / SCRIPT > < form action = '' method = 'POST' name = "myform1" > 用名: < input type = "text" name = "user" / > < br > 标题: < input type = "text" name = "title" / > < br > 内容: < textarea name = "content" cols = ' 60 ' rows = ' 9 ' > < / textarea > < br > < input type = 'submit' name = 'submit' value = 'submit' > < / form > |
看看效果吧:
虽然丑了点,但是还是有基本功能的。。。这款留言板没有对用户数据进行过滤,应该是可注入可xss的。。。我之后会加上过滤函数来试试的,欢迎大家交流。