2013-01-01 57 views
-1

我開始在PHP中創建一個cms,在安全性和總體設計方面我有點失落。這是非常基本的 - 它將能夠添加和刪除帖子/文章。爲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文件中的函數,並使表單執行插入功能,但似乎沒有工作。

+1

考慮添加formkey作爲隱藏字段。然後你的功能可以註冊一個formkey,你的CMS可以根據哪個formkey發佈操作。 –

+1

請記住防止CSRF。 –

回答

-1

對於表單動作使用$_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 

} 
+0

'$ _SERVER ['PHP_SELF']'-1,XSS洞。他可以使用'action =「」'留在當前頁面上。 – ThiefMaster

+0

我們可以將生成的ID或會話ID作爲隱藏字段添加到表單中,並驗證是否過濾掉XSS。 – Aznim

+0

這到底是如何避免通過PHP_SELF變量進行HTML注入的? 'http://yourhost/foo.php/

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; 
    } 
?> 
0

只有在提交表單時才需要調用insert函數,否則做其餘的事情。所以這應該是回答你的問題:

<?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> 

`