zoukankan      html  css  js  c++  java
  • PHPweb应用程序开发技巧

    本篇主要写了在PHP中编写web应用程序的一些技巧,包括一些表单的验证,web应用程序的安全性等。


    针对服务器设置调整行为:

     

         ini_get()函数可以检验某些脚本是否打开,如ini_get('Magic Quotes')

         ini_set()函数只是改进PHP应用程序的可移植性的一种方式,其方法是,使脚本依据服务器特有的信息采取不同的行为。

          eg

               打开PHPdisplay_errors设置:

                      

      ini_set('display_errors',1);

    检查服务器配置:

             

    function_exists()

      返回truefalse,以指示某个函数是否存在于PHP安装中。

             

    code
     1 if(function_exists('mysql_connect')){...}
    2
    3 if(function_exists('mysql_real_escape_string'))
    4 {
    5 global $dbc;
    6 $data=mysql_real_escape_string(strim($data),$dbc);
    7 }
    8 else
    9 {
    10 $data=mysql_escape_string(trim($data));
    11 }

      

    web应用程序安全性

     

    防止多次提交:

             如果正在使用会话,可使用一下方法:

                  

    1    if(isset($_SESSION['form_name']))...

      

             把唯一标识符存储在隐藏的表单输入框中:

                    <input type="hidden" name="stamp"  value="<?php echo md5(uniqid(rand(),true)); ?>">

                    需要使用rand()uniqid()md5()这几个函数,其中,uniqid()会创建一个唯一标识符。把这个标识符输入到rand()函数中,有助于生成一个更随机的数。最后,使用md5()对返回的结果进行散列(hash),这会创建一个长度刚好为32个字符的字符串。

     

             eg:

      

    register.php 

     

    connectdb.php
     1 <body>
    2 <?php
    3 DEFINE('DB_USER','root');
    4 DEFINE('DB_PWD','mysql');
    5 DEFINE('DB_HOST','localhost');
    6 DEFINE('DB_NAME','content');
    7
    8 $dbc=@mysql_connect(DB_HOST,DB_USER,DB_PWD) OR die ('Could not connect to MySQL:'.mysql_error());
    9 @mysql_select_db(DB_NAME) or die ('Could not select the database:'.mysql_error());
    10
    11 function escape_data($data)
    12 {
    13 global $dbc;
    14 if(ini_get('magic_quotes_gpc'))
    15 {
    16 $data=stripslashes($data);
    17 }
    18 return mysql_real_escape_string(trim($data),$dbc);
    19 }
    20 ?>
    21 </body>
    22
    23
    24 ---handle_comments.php
    25
    26 <?php
    27 echo 'handle';
    28 require_once('connectdb.php');
    29 if(!empty($_POST['name']))
    30 {
    31 $n=escape_data($_POST['name']);
    32 }
    33 else
    34 {
    35 echo '<p><font color="red">You forgot to enter your name.</font></p>';
    36 $n=false;
    37 }
    38 if(!empty($_POST['comments']))
    39 {
    40 $c=escape_data($_POST['comments']);
    41 }
    42 else
    43 {
    44 echo '<p><font color="red">You forgot to enter your comments.</font></p>';
    45 $c=false;
    46 }
    47 if(strlen($_POST['stamp'])==32)
    48 {
    49 $s=escape_data($_POST['stamp']);
    50 }
    51 else
    52 {
    53 echo '<p><font color="red">You forgot to enter your stamp.</font></p>';
    54 $s=false;
    55 }
    56 if($n && $c && $s)
    57 {
    58 $query="insert into urls(url,title,description) values('$n','$c','s')";
    59 $result=mysql_query($query);
    60 if(mysql_affected_rows()==1)
    61 {
    62 echo '<p>Thank you for your comments.</p>';
    63 }
    64 else
    65 {
    66 echo '<p><font color="red">Your comments could not be added.</font></p>';
    67 }
    68 }
    69 ?>

      

    验证正确的表单

     

             可以在一个接受数据处理的界面判断是否接受的数据是所期望的,这样可以避免某些刻意照成Web安全威胁的安全隐患:

             例如,在上例中,我们在handle_comments.php通过post方式接受的数据有namecommentssubmitstamp,就可以定义一个数组来存储这些变量:$allowed=array('name','comments','submit','stamp'),然后把接受的数据存储在一个数组里:$received=array_keys($POST),然后比较这两个数组是否相等:if($allowed==$received)  {...}

     

    处理HTML代码

     

            在提交界面中可能会有某些恶意用户输入一些HTMLjs代码弹出恶意窗口等。为了避免这些问题,需要对获取到的数据判断是否有HTML代码,并对它进行处理。常用的有几个函数:

           

    htmlspecialchars(),它把&'"<>转变成HTML实体格式(&amp;&quot;)

    htmlentities(),它把所有使用的字符转变成它们的HTML实体格式。

    strip_tags(),它删除所有所有的HTMLPHP标签。

     

    example
     1 function escape_data($data)
    2 {
    3 global $dbc;
    4 if(ini_get('magic_quotes_gpc'))
    5 {
    6 $data=stripslashes($data);
    7 }
    8 return mysql_real_escape_string(trim($data),$dbc);
    9 }
    10 $n=escape_data(htmlspecialchars($_POST['name']));
    11 $c=escape_data(htmlspecialchars($_POST['comments']));

    通过类型验证数据

     

    如果提交的变量是某种类型,则这些类型验证函数会返回true,否则返回false

     

    函数

    用于检查

    is_array()

     

    is_bool()

     

    is_float()

     

    is_int()

     

    is_null()

     

    is_numeric()

    数值,甚至是字符串,如"20"

    is_resource()

    资源,如数据库连接

    is_scalar()

    标量(单值)变量

    is_string()

     

     

     

    用法:

          首先,可先强制接收到的数据或通过相应函数测试是否为指定的数据类型:

        

      $quantity=(int) $_POST['quantity'];
    $price=(float) $_POST['price'];
    $tax=(float) $_POST['tax'];

      

    利用javascript进行表单验证

     

    我们可以在客户端写一个javascript代码对即将要提交的页面进行判断,根据其输入格式判断是否要提交

     

    example
     1 <script type="text/javascript" language="javascript">
    2 function check_data(my_form)
    3 {
    4 var problem=false;
    5 if(my_form.name.value=="")
    6 {
    7 alert("Enter your name.");
    8 my_form.name.value="***Name";
    9 my_form.name.focus();
    10 problem=true;
    11 }
    12 if(my_form.email.value=="")
    13 {
    14 alert("Enter your email address.");
    15 my_form.email.value="***Email Address";
    16 my_form.email.focus();
    17 problem=true;
    18 }
    19 if(my_form.url.value=="")
    20 {
    21 alert("Enter the URL");
    22 my_form.url.value="*** URL";
    23 my_form.url.focus();
    24 problem=true;
    25 }
    26 if((my_form.url_category.selectedIndex==0) || (my_form.url_category.value==0))
    27 {
    28 alert("Please select a category for this URL.");
    29 problem=true;
    30 }
    31
    32 if(problem)
    33 {
    34 return false;
    35 }
    36 else
    37 {
    38 return true;
    39 }
    40 }
    41 </script>
    42
    43 <form name="url_form" action="handle_submit_url" onsubmit="return check_data(this)">
    44 <fieldset><legend>Enter your information in the form below:</legend>
    45 <p><b>Your name:</b><input type="text" name="name" size="40" maxlength="60" /></p>
    46 <p><b>E-mail:</b><input type="text" name="email" size="40" maxlength="60"></p>
    47 <p><b>URL:</b><input type="text" name="url" size="40" maxlength="80" /></p>
    48
    49 <p><b>URL Category:</b><select name="url_category">
    50 <option value="3">Code Libraries</option>
    51 <option value="6">dfsgsdfgds</option>
    52 <option value="5">sadf</option>
    53 <option value="1">jyyuuy</option>
    54 <option value="4">uyfgbv.</option>
    55 <option value="2">fgk,b</option>
    56 </select></p>
    57 </fieldset>
    58
    59 <div align="center"><input type="submit" name="submit" value="Submit" /></div>

      

      

  • 相关阅读:
    SQL判断如果一列值为null则取另一列值代替 isnull()
    关于js的function.来自百度知道的回答,学习了.
    OSI七层与TCP/IP五层网络架构
    504 Gateway Time-out
    nginx中关于并发数的问题worker_connections,worker_processes
    php实现二叉树的遍历
    nginx负载均衡的简单实现
    linux shell数据重定向
    数据库范式的思考以及数据库的设计
    msyql中myism和innodb的区别
  • 原文地址:https://www.cnblogs.com/fanchangfa/p/2171239.html
Copyright © 2011-2022 走看看