【问题标题】:Creating a plan for PHP cms [closed]为 PHP cms 创建计划 [关闭]
【发布时间】:2013-01-01 10:27:04
【问题描述】:

我开始使用 PHP 制作 cms,但在安全性和整体设计方面我有点迷茫。这是非常基本的 - 它将能够添加和删除帖子/文章。

我想让它保持紧凑并尽可能少的文件。现在我正在研究这样的插入函数简单形式:

<form action="" method="POST">
  Title: <input type="text" name="title"></input>
  <br>
  Body:
  <br>
  <textarea cols="50" rows="5" name="body"></textarea>
  <br>
  <input type="submit" name="insert" value="Insert data into db" />
</form>

我故意将操作留空,因为我知道如何使用插入脚本执行此操作,但正如我所说,我想将其全部保存在 1 个文件中。我的插入功能有效,但要将其链接到表单,我必须将其放在我不想这样做的单独文件中。

我正在考虑以某种方式链接到我的 cms 文件中的一个函数并让表单执行执行插入的函数,但这似乎不起作用。

【问题讨论】:

  • 考虑添加一个表单键作为隐藏字段。然后您的函数可以注册一个表单键,您的 CMS 可以根据发布的表单键执行操作。
  • 记得防范 CSRF。

标签: php forms content-management-system


【解决方案1】:

请访问此站点http://www.ksoft.is-great.org/blog/view/create-blog-with-php,它将帮助您自己创建高级且安全的博客和 cms。她是我发现的一些例子

<?php
    require('db.php');
    function html_form($title='',$html='',$id='')
    {
        echo '
        <pre>
            <form method="post" id="form">
                <input value="'.$id.'" name="id" type="hidden">
                TITLE : <input value="'.$title.'" name="title" type="text">
                HTML : <textarea style="width:350px;" name="html" placeholder="Put your html     here..">'.$html.'
                </textarea>
                <input value="submit" type="submit">
            </form>
        </pre>';
    }

    function create_blog($title,$html)
    {
        $date = date('d.m.Y');
        $html = mysql_real_escape_string($html);
        $sql = "INSERT INTO blog (title, html, date) VALUES ('$title','$html','$date');";
        $q = mysql_query($sql);
        if($q) return true;
        else return false;
        echo mysql_error();
        mysql_close();
    }

    function get_title_id($title)
    {
        $sql = "select * from blog where title='$title'";
        $q = mysql_query($sql);
        while($ks = mysql_fetch_array($q))
        {
            return $ks['id'];
        }
        echo mysql_error();
    }

    function edit_blog($title,$html,$id)
    {
        $date = date('d.m.Y');
        $html = mysql_real_escape_string($html);
        $sql = "UPDATE blog SET title = '$title', html = '$html', date = '$date' WHERE id = '$id'";
        $q = mysql_query($sql);
        if($q) return true;
        else return false;
        mysql_close();
    }

    function delete_blog($id)
    {
        $sql= "delete from blog where id='$id'";
        $q = mysql_query($sql);
        if($q) return true;
        else return false;
        mysql_close();
    }

    function menu()
    {
        $sql = "SELECT * FROM blog ORDER BY id DESC LIMIT 0 , 8 ";
        $q = mysql_query($sql);
        while($data = mysql_fetch_array($q))
        {
            echo '<a id="left_menu" href="?id=%27.$data[%27id%27].%27"> '.$data['title'].'</a><br>';
        }
        mysql_close();
    }

    function blog_list()
    {
        $sql = "select * from blog";
        $q = mysql_query($sql);
        echo '<form method="post"><select name="id">';
        while($data = mysql_fetch_array($q)){
            echo '<option value=".$data[" id'].'"=""> '.$data['title'].'</option>';
        }
        echo '</select><br><input value="submit" type="submit"></form>';
    }

    function get_title($id)
    {
        $sql = "select * from blog where id='$id'";
        $q = mysql_query($sql);
        while($data = mysql_fetch_array($q)){
            return $data['title'];
        }
    }

    function get_html($id)
    {
        $sql = "select * from blog where id='$id'";
        $q = mysql_query($sql);
        while($data = mysql_fetch_array($q)){
            return $data['html'];
        }
    }

    function check_id($id)
    {
        $sql = "select * from blog where id='$id'";
        $q = mysql_query($sql);
        if(mysql_num_rows($q)>0) return true;
        else return false;
    }
?>

【讨论】:

    【解决方案2】:

    只有在提交表单时才需要调用插入函数,否则执行其余操作。所以这应该是你问题的答案:

    <?php 
    
    if($_POST){
       // This part is executed only when form is submitted. 
      // insert code will come here.
    }
    
    ?>
    
    <form action="" method="POST">
      Title: <input type="text" name="title"></input>
      <br>
      Body:
      <br>
      <textarea cols="50" rows="5" name="body"></textarea>
      <br>
      <input type="submit" name="insert" value="Insert data into db" />
    </form>
    

    `

    【讨论】:

      【解决方案3】:

      对于表单操作,请使用$_SERVER['PHP_SELF'];,这将使用当前 url 填充表单操作字段,因此您不必定位另一个文件...它与将其留空具有相同的效果,但更安全。

      讨厌的东西也可以作为 SQL 注入之类的值放入表单字段中......有一个非常好的函数 mysql_real_escape_string 可以使任何注入的 SQL 查询不可用。

      您还应该尽可能地验证所有字段。

      我为此创造了一些东西:

      checkForm($formData = array()) {
      
       foreach ($formData as $key=>$element) {
      
        $elementType = explode('-',$key);
      
        siwtch ($elementType[0]) {
      
          case 'textarea':
            //validate text area
          break;
      
          case 'textfield':
            //validate text field
          break;
      
          case 'numbers':
            //validate numbers
          break;
      
          case 'submit':
           //skip
          break;
      
          default:
            //validate everything
          break;
        }
      
       }
      
      }
      

      对于退货选项,这取决于您。在我的例子中,这个函数返回一个经过验证和清理的值的数组。

      这个表格应该是这样的:

      <form action="<?php $_SERVER['PHP_SELF']; ?>" method="post">
         <input type="text" name="textfield-title" placeholder="title" /><br />
         <textarea name="textarea-body" placeholder="body"></textarea>
         <input type="submit" name="submit-blogEntry" value="Submit" />
      </form>
      

      为了触发整个事情,我可以推荐这样的东西:

      form.php   
      
      if (isset($_POST['submit-blogEntry'])) {
      
        checkForm();
      
      } else {
      
        //display form
      
      }
      

      【讨论】:

      • $_SERVER['PHP_SELF'] -1,XSS 漏洞。他可以使用action="" 停留在当前页面上。
      • 我们可以将生成的 id 或会话 id 作为隐藏字段添加到表单中,并对其进行验证以过滤掉 XSS。
      • 这到底是如何避免通过 PHP_SELF 变量注入 HTML 的呢? http://yourhost/foo.php/&lt;script&gt;... 仍然有效!
      • 有关防御 XSS 的信息请参考此站点:link 或查看此处:link... 还有一些方法可以使用 $_SERVER['SCRIPT_NAME']; 代替 $_SERVER['PHP_SELF'];,但感谢建设性的 cmets... 它确实为答案增加了价值。
      猜你喜欢
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      相关资源
      最近更新 更多