2010-03-01 137 views
0

嘿,夥計們,今天我訪問了我的網站,我看到有人在我的故事表中插入超過1000查詢防垃圾郵件

我的腳本是在PHP/MySQL和我已經啓用了驗證碼,我不知道他怎麼能做這樣的事情

一個簡單的表格,並在另一個函數,它檢查$ VAR和驗證它們,然後在數據庫中插入

我敢肯定,他是用一個機器人做這樣的事情

IM真的困惑

這是我的功能驗證,並插入到表

function submitStory($name, $address, $subject, $story, $storyext, $topic, $alanguage,$tags) { 

     $subject = check_words(check_html(addslashes($subject), "nohtml")); 
     $story = check_words(addslashes($story), "nohtml"); 
     $storyext = check_words(addslashes($storyext), "nohtml"); 

     $result = $db->sql_query("INSERT INTO ".$prefix."_stories 
      (sid,catid,aid,title,time,hometext,bodytext,newsref,newsreflink,comments,counter,topic,informant,notes,ihome,alanguage,acomm,hotnews,haspoll,pollID,associated,tags,approved,section) 
     VALUES 
(NULL, '$catid', '', '$subject', now(), '$story', '$storyext', '','', '0', '0', '$topic', '$name', '', '', '$alanguage', '', '', '0', '0', '','$tag_ids','2','news')"); 

mysql_error(); 


     include ('header.php'); 
     echo "<font class=\"content\"><b>"._THANKSSUB."</b><br><br>" 
     .""._SUBTEXT."" 
     ."<br>"._WEHAVESUB." $waiting "._WAITING.""; 

     include ('footer.php'); 
    } 
+7

您有一個SQL注入漏洞。 您需要使用參數。 – SLaks 2010-03-01 18:27:17

+2

@Mac:供參考:http://www.php.net/manual/en/pdo.prepared-statements.php。關於使用PDO的教程,包括準備好的語句:http://www.kitebird.com/articles/php-pdo.html – outis 2010-03-01 18:53:30

+1

您確實在檢查驗證碼是否有效? – jasonbar 2010-03-01 19:20:41

回答

2

最有可能的SQL injection attack。您應該立即將您的站點脫機,而不是重新啓用它,直到您同時修復了漏洞並仔細檢查了數據庫中的惡意軟件(例如Zeus dropper)。

如果您的網站允許用戶生成的內容,你也應仔細過濾這些邪惡的HTML代碼,JavaScript等

+0

一個殘酷的現實,但是如果您可以在不保證代碼安全的情況下將該網站脫機以防止進一步濫用,那麼您應該這樣做。 – Kzqai 2011-09-17 00:19:50

3

@Mac,

雖然要添加到和addslashes幾個變量,其餘的都暴露給sql注入。請申請mysql_real_escape_string功能,所有的變量,並在列表中包括以下內容:

$catid, $topic, $name, $alanguage, $tag_ids 

我建議你堅決申請mysql_real_escape_string但如果你是在一個真正着急,想速戰速決嘗試一下馬上不不得不想知道mysql_real_escape_string究竟是什麼以及它做了什麼,然後至少在function submitStory內將addslashes應用於我上面提到的變量。

你可以閱讀更多關於mysql_real_escape_string here

希望這有助於。讓我們知道。

+0

稍等片刻,我知道這意味着什麼,我只是削減了我的函數的一些代碼,問題是他們如何在我的數據庫中插入這些數量的查詢,所以你說這個問題只是在過濾$ vars?!即時通訊肯定錯誤是在別的地方!也許在哪裏條件 – 2010-03-01 18:56:41

+0

'哪裏條件'?我的朋友,你的查詢甚至不使用WHERE條件。如果您正在討論您正在使用的功能與上面列出的功能不同的WHERE條件,那麼可能是。他們如何做到這一點?這是因爲你沒有逃過我提到的變量,這使得他們巧妙地制定自己的查詢並使用它,而不是你期望的常規輸入值。有些人對DB的架構有所瞭解,或者擅長猜測,只能猜測並嘗試注入他們的代碼。那有意義嗎? – Devner 2010-03-01 19:21:10

+0

我的代碼是開源的,每個人都可以看到它,嗯,我應該學習更多的安全性,仍然可以肯定沒有問題,因爲我的變數沒有任何問題,因爲我逃脫了所有他們,沒有列出他們在我的問題。 應該有別的東西我不知道。 他們對我的註冊部分做了同樣的處理,並向我的數據庫中注入了大量數據,該部分由專業編碼人員編寫,該數據庫爲 。 即使這些部件都具有驗證碼系統。 呃 – 2010-03-01 20:04:02

0
  1. 一旦有人獲得了驗證碼,他們可以發佈任何數量的故事嗎? (即現在認爲該會議是安全的)。這隻能證明他們是人類第一次嘗試......

  2. 有人註冊後是否有發佈限制?

  3. 您是否爲每個註冊用戶的會話和表單生成了一個ID,以便他們的憑證不能在XSS中使用?

如果1爲真或者2和3爲假,他們絕對可以運行腳本來發送數據庫垃圾郵件。

+0

是的,他們可以發佈任何數字,幾天前我問如何阻止垃圾郵件發送者在PHP和延遲張貼,但沒有收到一個很好的答案, – 2010-03-01 20:06:41

+0

爲每個用戶添加時間戳$ _Session。發佈故事時,請檢查當前時間戳與會話戳。如果它少於您設置的時間(例如,新故事爲45秒,編輯爲10秒),則顯示錯誤。 – Cryophallion 2010-03-02 03:17:36