2017-07-30 7 views
0

嗨,我真的在我的編程生涯的開始。 我必須爲我的學校項目編寫一個小網站。 我沒有實現某種的留言在我的網站,並試圖確保該才能發佈到數據庫的一些SQL注入等變量

在主頁guestbook.php我的輸入形式:

< form action="post.php" method="post"> 
< strong>Name:< /strong><br/> < input type="text" name="name" /><br/> 
< strong>Message:< /strong><br/> < textarea name="message" rows="5" 
    cols="25">< /textarea><br/> 
< input type="submit" value="send"> 
</form> 

我的帖子方法PHP:

< ?php 
require_once 'config.php'; (db connect) 
$fields = array("name", "message"); 

$isOkay = TRUE; 


foreach ($fields as $field) { 
    if (empty($_POST[$field])) { 
     $isOkay = FALSE; 
    } 
} 


if ($isOkay) { 
    extract($_POST); 

    $now = time(); 
    if (mysqli_query($db_link,"insert into comments (`name`,message,`timestamp`) values ('{$name}','$message','{$now}')")) { 
     header("Location: guestbook.php"); 
    } else { 
     echo "Can't connect to database."; 
    } 
} else { 
    echo "One or more fields are empty."; 
} 
?> 

一切正常,並得到貼到我的數據庫,但如果我現在添加一些像這樣我的代碼:

$safename = $_POST["name"]; 
$name = mysql_real_escape_string($safename) 
$safemessage = $_POST["message"]; 
$message = mysql_real_escape_string($safemessage) 

我試圖進入我的數據庫我的變量現在是空的... 可能是一個愚蠢的錯誤在我身邊,但有人願意幫助我在這裏?

在此先感謝:)

+0

爲什麼這裏有空格'<?php'? - 你在這裏混合APIs! – Qirel

+0

您已經在使用支持**準備語句的API,並且使用有界變量輸入,您應該使用帶佔位符(預準備語句)的參數化查詢來保護數據庫免受[SQL注入](http://stackoverflow.com/q/60174 /)! 開始使用['mysqli :: prepare()'](http://php.net/mysqli.prepare)和['mysqli_stmt :: bind_param()'](http://php.net/mysqli-stmt .bind-PARAM)。 – Qirel

+0

我知道這是你項目的早期階段,我可以告訴你已經看到了潛在的問題,但是避免使用extract()和客戶端的數據。攻擊者可以添加發布的數據來設置他喜歡的任何變量。 – struthersneil

回答

-1

您可以用$ _REQUEST全局變量嘗試。 $ _POST變量只有在數據被「發佈」時才被填充,並且$ _GET僅在發送HTTP查詢字符串時被填充。 $ _REQUEST由兩種方法填充。

0

我不知道是否還有其他錯誤,但mysql_real_escape_stringmysqli_real_escape_string

所以你最後的代碼看起來前人的精力像:

$safename = $_POST["name"]; 
$name = mysqli_real_escape_string($db_link, $safename) 
$safemessage = $_POST["message"]; 
$message = mysqli_real_escape_string($db_link, $safemessage) 

其他旁註: 空間<後不需要 < form可以寫成<form,就像<br>即可。

相關問題