亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

PHP中一些通用和易混淆技術點的最佳編程實踐

2020-03-22 19:50:12
字體:
來源:轉載
供稿:網友
  • 介紹

    PHP是一門復雜的語言,讓你長年承受內心的迂回,彎曲,拉伸和打擊。它自相矛盾有時候充滿bug。每個版本都有其獨特的特性,缺點以及怪癖,而且你很難追蹤什么版本有什么問題。不難想見為什么有時候它會招致那么多怨恨。

    盡管如此,它是時下web中最流行的語言。由于它的悠久歷史,你能找到許多教程,關于一些基本事情的做法,如密碼哈希(一次性加密)和數據庫訪問。 問題在于從五篇教程里,關于某件事情你很有可能找到五種完全不同的方法。哪個方法才是“正確”的方法呢?其它的方法有瑕疵或者意想不到的問題嗎?確實很難 弄清楚,而且你會在網絡里到處點擊,以試圖確定正確的答案。

    那也是為什么新的PHP程序員經常會為其丑陋,過時或不安全代碼受到批評的原因之一。如果第一次Google搜索結果是一篇傳授5年前方法的4年前的文章,他們就不能幫助這些有所改觀。

    這篇文章試圖做這些工作。它嘗試將一系列基本的操作提示匯集起來,這些可以被認為是PHP中處理普遍的令人困惑的難題時的最佳實踐。如果PHP中一個低等級的任務具有多個和令人困惑的方法,它就屬于這里。

    它是什么

    它是在面對PHP程序員可能會遇到的普通的低級任務時,由于PHP提供了 許多選擇而不容易了解到的,最佳途徑的建議指導。例如:對許許多多可能的PHP解決方案,連接到數據庫是一個普通的任務,但這些方案并不都是好的——因此,這個​問題包含在這篇文章中。

    它是一系列短小,引導式的解決方案。你應該行動起來將例子運行于基礎的配置環境,而且你應該自己研究從中找到對自己有用的東西。

    它指出了我們所理解的最先進的PHP。但是,這也意味著如果你正使用較老版本的PHP,可能你就沒有實現這些方案所需要的一些特性。

    這是一篇動態文件,隨著PHP的繼續演進,我將努力保持相應更新。

    它不是什么?

    這篇文章不是PHP教程。你應該在別的地方學習基礎和語法。

    它不是普通web應用問題的指南,比如cookie存儲,緩存,代碼風格,文檔等等。

    它不是安全向導。當觸及一些安全相關的問題時,你要自己研究怎么樣才能對你的PHP應用加固。特別的,在著手實施以前,你應該仔細回顧一下這里給出的任何建議方案。你的代碼責任在于你。

    它不是某種代碼風格,模式或者框架的擁護者。

    它不是關于如何去做高等級任務,如用戶注冊,登錄系統等等諸如此類任務的特定方法的支持者。這篇文章完全是為低等級任務,是因為PHP的長久歷史,可能會令人困惑或者不甚清楚。

    它不是終極意義的解決方案,也不是唯一方案。下面描述的一些方法可能對你實際的情況不是最優的,而且有許多能達到同樣目的的不同的方法。特別的,高負載的web應用可能會從更多的針對這些問題的秘密方案中獲益。

    我們使用的是哪個 PHP 版本?帶有 Suhosin-補丁的PHP 5.3.10-1ubuntu3.6, 安裝于 Ubuntu 12.04 LTS.

    PHP如同是網絡世界的百年老龜。它的外殼上刻有一個豐富的,令人費解的,粗糙的歷史。在一個共享主機的環境下,它的配置可能會限制你能做什么事情。

    為了保留一絲明智,我們需要只專注于一個版本的PHP。截至2013年4月30,該版本是 帶有Suhosin補丁的PHP5.3.10-1ubuntu3.6 。如果你使用apt-get從一個Ubuntu12.04 LTS服務器來安裝PHP的話,你所得到的版本就是這個。換句話說,許多人在默認情況下已經很明智地使用了它。

    您可能會發現本文這些解決方案能工作于不同或更舊版本的PHP。如果是這樣的話,就要由你來研究在這些舊版本中的細微錯誤或安全問題的影響了。

    保存密碼使用 phpass 庫計算密碼的哈希值進行比較。

    用 phpass 0.3 進行的測試。

    散列化是在把用戶密碼保存進數據庫之前對其進行保護的標準方法。許多常見的散列算法,如MD5,乃至SHA1,用于存儲密碼都是不安全的,因為黑客可以使用這些散列算法輕松破解密碼。

    要散列化密碼最安全的方法是使用bcrypt算法。開源的phpass 庫用一個易于使用的類來提供這個功能。

    例子:
    <?php    // 包含phpass庫    require_once('phpass-0.3/PasswordHash.php');    // 初始化散列器為不可移植(這樣更安全)    $hasher = new PasswordHash(8, false);    // 計算密碼哈希值。$hashedPassword 將會是一長為60個字符的字符串.    $hashedPassword = $hasher->HashPassword('my super cool password');    // 你現在可以安全地保存$hashedPassword到數據庫中!    // 通過比較用戶輸入內容(產生的哈希值)和我們之前計算出的哈希值,來判斷用戶是否輸入了正確的密碼    $hasher->CheckPassword('the wrong password', $hashedPassword); // 返回假    $hasher->CheckPassword('my super cool password', $hashedPassword); // 返回真    ?>
    陷阱很多來源會建議你在計算密碼的哈希值之前先給密碼加點“作料”。這是個好主意,phpass已經利用HashPassword() 函數中的一部分代碼來為你給密碼加了作料。 這就意味著你并不需要自己再親自做這個了。進一步閱讀

    phpass Why hashing passwords with md5 or sha is unsafe

    How to safely store a password

    連接到并查詢html' target='_blank'>MySQL數據庫使用 PDO和它預定義的語句功能.

    在PHP中有很多方法連接到一個MySQL數據庫。 PDO (PHP Data Objects) 是其中最新最健壯的。對于許多不同類型的數據庫,PDO都使用一致性的接口,采用面向對象的方式,并支持較新的數據庫的提供的更多特性。

    您應該使用PDO預定義語句的功能,以幫助防止SQL注入攻擊。使用 bindValue() 函數確保你的SQL對于第一階的SQL注入攻擊是安全的(但這不是100%萬無一失的,參考 進一步閱讀 獲得更詳細說明)。在過去,這只能用一些“魔術引號”函數的復雜結合來實現。PDO使所有這些黏糊糊的東西變得不再必要了。

    示例 :
    <?php    try{        // Create a new connection.        // You'll probably want to replace hostname with localhost in the first parameter.        // The PDO options we pass do the following:        // /PDO::ATTR_ERRMODE enables exceptions for errors.  This is optional but can be handy.        // /PDO::ATTR_PERSISTENT disables persistent connections, which can cause concurrency issues in certain cases.  See "Gotchas".        // /PDO::MYSQL_ATTR_INIT_COMMAND alerts the connection that we'll be passing UTF-8 data.  This may not be required depending on your configuration, but it'll save you headaches down the road if you're trying to store Unicode strings in your database.  See "Gotchas".        $link = new /PDO(   'mysql:host=your-hostname;dbname=your-db',                            'your-username',                            'your-password',                            array(                                /PDO::ATTR_ERRMODE => /PDO::ERRMODE_EXCEPTION,                                /PDO::ATTR_PERSISTENT => false,                                /PDO::MYSQL_ATTR_INIT_COMMAND => 'set names utf8mb4'                            )                        );        $handle = $link->prepare('select Username from Users where UserId = ? or Username = ? limit ?');        // PHP bug: if you don't specify PDO::PARAM_INT, PDO may enclose the argument in quotes.  This can mess up some MySQL queries that don't expect integers to be quoted.        // See: https://bugs.php.net/bug.php?id=44639        // If you're not sure whether the value you're passing is an integer, use the is_int() function.        $handle->bindValue(1, 100, PDO::PARAM_INT);        $handle->bindValue(2, 'Bilbo Baggins');        $handle->bindValue(3, 5, PDO::PARAM_INT);        $handle->execute();        // Using the fetchAll() method might be too resource-heavy if you're selecting a truly massive amount of rows.        // If that's the case, you can use the fetch() method and loop through each result row one by one.        // You can also return arrays and other things instead of objects.  See the PDO documentation for details.        $result = $handle->fetchAll(/PDO::FETCH_OBJ);        foreach($result as $row){            print($row->Username);        }    }    catch(/PDOException $ex){        print($ex->getMessage());    }    ?>

    當綁定整型變量時,如果不傳遞PDO::PARAM_INT參數有事可能會導致PDO對數據加引號。這會 搞壞特定的MySQL查詢。查看該bug報告。未使用 `set names utf8mb4` 作為首個查詢,可能會導致Unicode數據錯誤地存儲進數據庫,這依賴于你的配置。如果你 絕對有把握你的Unicode編碼數據不會出問題,那你可以不管這個。啟用持久連接可能會導致怪異的并發相關的問題。這不是一個PHP的問題,而是一個應用層面 的問題。只要你仔細考慮了后果,持久連接一般會是安全的。查看Stack Overfilow這個問題。即使你使用了 `set names utf8mb4` ,你也得確認實際的數據庫表使用的是utf8mb4字符集!可以在單個execute()調用中執行多條SQL語句。只需使用分號分隔語句,但注意這個bug,在該文檔所針對的PHP版本中還沒修復。
    PHP編程

    鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
    亚洲人午夜色婷婷| 日韩资源在线观看| 国产欧美久久久久久| 久久综合伊人77777| 91精品国产九九九久久久亚洲| 91免费福利视频| 国产精品91免费在线| 最近的2019中文字幕免费一页| 国产97在线视频| 亚洲最大在线视频| 日韩中文理论片| 九色精品免费永久在线| 日韩免费视频在线观看| 91精品视频大全| 国产精品视频区1| 亚洲欧美激情四射在线日| 亚洲新声在线观看| 亚洲精品视频中文字幕| 欧美午夜精品久久久久久人妖| 国产一区二区动漫| 91麻豆国产精品| 一区二区三区美女xx视频| 欧美性猛交xxxx黑人猛交| 日本国产一区二区三区| 久久精品视频99| 亚洲免费av网址| 国产精品成人v| 日本久久久a级免费| 国产精品高潮呻吟久久av野狼| 色妞久久福利网| 1769国内精品视频在线播放| 久久精品美女视频网站| 国产视频在线一区二区| 亚洲美女www午夜| 97涩涩爰在线观看亚洲| 九九精品在线观看| 欧美日韩精品国产| 欧美大片欧美激情性色a∨久久| 亚洲免费电影在线观看| 亚洲爱爱爱爱爱| 91精品视频免费看| 国产成人拍精品视频午夜网站| 97不卡在线视频| 久久99久久99精品免观看粉嫩| 欧美性猛交xxxx乱大交蜜桃| 91精品国产91久久久久福利| 91精品国产综合久久久久久久久| 国产婷婷97碰碰久久人人蜜臀| 欧美日韩国产91| 91久久精品美女高潮| 国产69精品久久久久9999| 欧美国产中文字幕| 亚洲精品免费在线视频| 2019中文字幕在线观看| 日韩69视频在线观看| 久久精品福利视频| 伊人亚洲福利一区二区三区| 国产精品第一视频| 亚洲成人在线网| 亚洲精品wwww| 日韩av一区在线| 欧美有码在线观看| 欧美香蕉大胸在线视频观看| 亚洲男人av电影| 亚洲国产成人精品久久久国产成人一区| 欧美日韩性生活视频| 中文字幕日韩免费视频| 亚洲一区二区三区在线视频| 91精品国产色综合| 亚洲最大在线视频| 久久久这里只有精品视频| 一个人看的www欧美| 亚洲天堂av在线免费观看| 亚洲自拍中文字幕| 亚洲a级在线播放观看| 久久久99免费视频| 国产一区二区三区在线| 亚洲aⅴ男人的天堂在线观看| 国内精品久久影院| 国产欧美 在线欧美| 中文字幕一区电影| 日韩在线中文字幕| 久久偷看各类女兵18女厕嘘嘘| 亚洲欧美日韩天堂一区二区| 在线性视频日韩欧美| 日韩电影免费观看在线观看| 亚洲va久久久噜噜噜久久天堂| 国产日本欧美视频| 91精品视频播放| 成人黄色片网站| 国产午夜精品一区二区三区| 一个色综合导航| 日本在线精品视频| 亚洲欧洲国产伦综合| 成人国内精品久久久久一区| 亚洲男人天天操| 这里只有精品在线播放| 久久福利网址导航| 欧美一级高清免费播放| 国产亚洲人成网站在线观看| 久久成人人人人精品欧| 国产乱人伦真实精品视频| 福利视频导航一区| 成人免费网站在线看| 中文字幕亚洲情99在线| 国产亚洲精品久久久久久777| 91精品美女在线| 久久精品福利视频| 在线观看欧美日韩| 中文字幕亚洲天堂| 国产精品福利无圣光在线一区| 亚洲少妇激情视频| 久久久视频免费观看| 精品亚洲一区二区三区在线播放| 日韩精品中文字幕在线播放| 性欧美办公室18xxxxhd| 欧美国产日韩视频| 美女性感视频久久久| 国产91久久婷婷一区二区| 国产精品久久久久久超碰| 欧美另类交人妖| 亚洲精品国精品久久99热一| 久久色在线播放| 91久久精品国产| 久久中文字幕在线视频| 国产在线观看精品一区二区三区| 亚洲一区美女视频在线观看免费| 久久久久久久久久婷婷| 永久555www成人免费| 91亚洲午夜在线| 欧美乱大交做爰xxxⅹ性3| 色妞久久福利网| 亚洲国产日韩欧美在线99| 国产人妖伪娘一区91| 日韩在线观看高清| 日韩精品小视频| 成人免费网视频| 欧美亚洲午夜视频在线观看| 国产亚洲欧美日韩一区二区| 一区二区在线视频| 亚洲人成电影在线播放| 国产黑人绿帽在线第一区| 宅男66日本亚洲欧美视频| 国产午夜精品免费一区二区三区| 久久精品国产亚洲| 91爱视频在线| 色综久久综合桃花网| 亚洲a一级视频| 久久久久久久色| 97精品视频在线观看| 欧美老女人性生活| 欧美大片免费观看在线观看网站推荐| 亚洲精品资源美女情侣酒店| 久久全球大尺度高清视频| 色综合久久久久久中文网| 国产精品视频午夜| 亚洲视频在线观看免费| 国产视频丨精品|在线观看| 成人午夜在线视频一区| 欧洲成人性视频| 色老头一区二区三区在线观看| 色综合色综合久久综合频道88| 国产成人精品在线视频| 亚洲精品97久久|