php
  • mysql
  • adodb
  • 2010-11-24 85 views 1 likes 
    1

    我使用PHP與adodb,但遇到了一個巨大的問題。我使用ADODB加快發展,所以我可以做的事情,如:php mysql adodb

    $r["Name"] = $_POST['txtName']; 
    
    if ($_POST["ID"] != "") 
        $conn->AutoExecute("content", $r, 'UPDATE', 'AutoID = ' . $_POST["ID"]);  
    else 
        $conn->AutoExecute("content", $r, 'INSERT'); 
    

    然而,如果該名稱是有一個單引號中它保存到數據庫以斜線!所以如果這個名字是Testimonial的話,它會保存爲Testimonial,這會給我造成巨大的問題,反正我可以避免這個,但是仍然像上面那樣編程,因爲它比準備插入/更新語句快得多。

    乾杯

    +0

    它這樣做,所以你不會最終與黑客/破碎的數據庫。我的建議是把它留在數據庫中,並在出路上修復它。 – DampeS8N 2010-11-24 13:41:28

    +0

    您可能已啓用magic_quotes。試試`phpinfo()`來查明這是否是 – 2010-11-24 13:50:36

    +0

    @Dampe nope。如果斜線實際上將其放入數據庫中,則某些內容被打破 – 2010-11-24 14:05:07

    回答

    2

    正確的,並最終解決這一問題是由兩個部分組成:

    1. 禁用所有magic_quotes程序在你的代碼。這可確保您擁有一個可以使用的已知配置,如果/當管理員更改這些php.ini設置時,這些配置不會被破壞。
    2. 在訪問數據庫之前驗證/引用所有傳入的用戶輸入!

    雖然第一部分是良好的編程,但第二部分對於編寫安全的應用程序是絕對必要的!

    引述用戶輸入有兩種方法可以去:

    1. 手動(使用ADODB的qstrQuote),在這種情況下,你必須非常非常小心,不會錯過任何東西。對於小型項目來說這可能是相當可行的,過去我曾多次這樣做過。
    2. 使用準備好的語句和綁定變量來進行查詢。這確保了只要您正確指定變量類型,就不會在您的應用程序中存在SQL注入,並且比第一個選項更容易出錯。這就是我現在所做的一段時間。

    更新:

    如果你有準備的語句去,你可能會發現ADODB不買你那麼多,你可以使用PDO的大部分工作。當你需要「automagic」時,你可以自己編寫一些特定於應用程序的函數。根據我的經驗,這只是一點點工作,總體上比包含AdoDB更好。

    0

    感謝您的輸入,我已經決定在運行時使用該功能打開魔術引號的:

    if (get_magic_quotes_gpc()) { 
        function stripslashes_gpc(&$value) 
        { 
         $value = stripslashes($value); 
        } 
        array_walk_recursive($_GET, 'stripslashes_gpc'); 
        array_walk_recursive($_POST, 'stripslashes_gpc'); 
        array_walk_recursive($_COOKIE, 'stripslashes_gpc'); 
        array_walk_recursive($_REQUEST, 'stripslashes_gpc'); 
    } 
    

    不過是那麼容易受到SQL注入?

    相關問題