2011-03-15 85 views
1
$alerter2="false"; 
for ($counter = 0; $counter <= count($filter); $counter++) { 
    $questionsubmitted=strtolower($_POST[question]); 
    $currentcheck =$filter[$counter]; 
    $foundvalue=stripos((string)$questionsubmitted,(string)$currentcheck); 
    echo $foundvalue; 
    if ($foundvalue==0) { 
     $alerter2="true"; 
    } else { } 
} 

if (!($alerter2=="true")) { 
    $sql="INSERT INTO Persons (Name, Email, Question) 
     VALUES 
     ('$_POST[name]','$_POST[email]','$_POST[question]')"; 
} else { 
    echo "Please only post appropriate questions"; 
} 

由於某些原因,每當我運行這個,每次迭代stripos都會返回0。它應該是一個過濾器,並使用回聲,我發現每當它出現時,stripos都是0。然而,當我在if中使用0時,即使那些沒有單詞的人也會返回true。奇怪的布爾反應

我應該在哪裏使用mysql_real_escape_string?查詢後?請注意,我將這段代碼放在了我希望將用戶輸入保存到數據庫的地方。

+2

使用'mysql_escape_real_string();'您'$ sql'內'$ _POST'變量將是另一個事 – kjy112 2011-03-15 14:05:19

+3

SQL注射攻擊! – Arafangion 2011-03-15 14:05:54

+2

使用字符串表示「true」和「false」。真?? – Spudley 2011-03-15 14:08:51

回答

0

您需要更改

if ($foundvalue==0) 

if ($foundvalue===0) // three equals signs 

或等價的東西,這取決於你的邏輯(我不明白這是怎麼回事)。

但正如大家所說,此代碼是開放的SQL注入攻擊(以及其他問題)。

2

stripos如果找不到值,則返回false;如果是第一個字符,則返回0。問題是,PHP自動將布爾值轉換爲0整數或將0整數轉換爲false。所以我認爲演員陣容正在發生,因此這種狀況不會達到你想要的。

您可以使用===也檢查變量的類型:

if ($foundvalue === 0) { 
    $alerter2="true"; 
} 

有關於stripos鏈接的文檔中這個問題的更多細節。

您還應該刪除空的else子句以獲得更乾淨的代碼,並使用mysql_real_escape_string在將值放入數據庫之前對其進行消毒。

0

此外,

$questionsubmitted=strtolower($_POST[question]); 

也許應該是:

$questionsubmitted=strtolower($_POST['question']); 
+0

是的,這確實有效,但是您每次以這種方式執行時都會在您的PHP通知中記錄文件。 'question'(without apostrophs)被視爲常量表達式(即以前由define('question','somevalue')定義,儘管常量應該用大寫字母表示),在你的情況下不是。 – 2011-03-15 14:19:38