{"action":"created","issue":{"url":"https://api.github.com/repos/goragod/kotchasan/issues/2","labels_url":"https://api.github.com/repos/goragod/kotchasan/issues/2/labels{/name}","comments_url":"https://api.github.com/repos/goragod/kotchasan/issues/2/comments","events_url":"https://api.github.com/repos/goragod/kotchasan/issues/2/events","html_url":"https://github.com/goragod/kotchasan/issues/2","id":119153907,"number":2,"title":"class Password","user":{"login":"phpinfo-in-th","id":8635641,"avatar_url":"https://avatars.githubusercontent.com/u/8635641?v=3","gravatar_id":"","url":"https://api.github.com/users/phpinfo-in-th","html_url":"https://github.com/phpinfo-in-th","followers_url":"https://api.github.com/users/phpinfo-in-th/followers","following_url":"https://api.github.com/users/phpinfo-in-th/following{/other_user}","gists_url":"https://api.github.com/users/phpinfo-in-th/gists{/gist_id}","starred_url":"https://api.github.com/users/phpinfo-in-th/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/phpinfo-in-th/subscriptions","organizations_url":"https://api.github.com/users/phpinfo-in-th/orgs","repos_url":"https://api.github.com/users/phpinfo-in-th/repos","events_url":"https://api.github.com/users/phpinfo-in-th/events{/privacy}","received_events_url":"https://api.github.com/users/phpinfo-in-th/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":2,"created_at":"2015-11-27T08:45:28Z","updated_at":"2015-12-03T09:24:31Z","closed_at":null,"body":"class Password ใช้ algo อย่างง่ายเพื่อ encode และ decode รหัสผ่าน\r\nซึ่งถึือว่าไม่เหมาะสมอย่างยิ่ง ควรเปลี่ยนไปใช้ cryptographic function เช่น `openssl` หรือ `mcrypt` แทน\r\n\r\nและยังมี bug ทั้งใน `encode()` และ `decode()` เพราะว่าใช้ `mb_strlen()` ในการหาความยาวของสตริง แต่เวลาอ่านสตริง ใช้ `substr()` และ `ord()` ที่ไม่ได้เป็น multibyte safe\r\nวิธีแก้คือ ใช้ `strlen()`\r\n\r\n```php\r\npublic static function encode($string)\r\n{\r\n\t$key = sha1((string)\\Kotchasan::$config->password_key);\r\n\t//$str_len = mb_strlen($string);\r\n\t//$key_len = mb_strlen($key);\r\n\t$str_len = strlen($string);\r\n\t$key_len = strlen($key);\r\n\t$j = 0;\r\n\t$hash = '';\r\n\tfor ($i = 0; $i < $str_len; $i++) {\r\n\t\t$ordStr = ord(substr($string, $i, 1));\r\n\t\t$j = $j == $key_len ? 0 : $j;\r\n\t\t$ordKey = ord(substr($key, $j, 1));\r\n\t\t$j++;\r\n\t\t$hash .= strrev(base_convert(dechex($ordStr + $ordKey), 16, 36));\r\n\t}\r\n\treturn $hash;\r\n}\r\n```"},"comment":{"url":"https://api.github.com/repos/goragod/kotchasan/issues/comments/161562867","html_url":"https://github.com/goragod/kotchasan/issues/2#issuecomment-161562867","issue_url":"https://api.github.com/repos/goragod/kotchasan/issues/2","id":161562867,"user":{"login":"goragod","id":2264492,"avatar_url":"https://avatars.githubusercontent.com/u/2264492?v=3","gravatar_id":"","url":"https://api.github.com/users/goragod","html_url":"https://github.com/goragod","followers_url":"https://api.github.com/users/goragod/followers","following_url":"https://api.github.com/users/goragod/following{/other_user}","gists_url":"https://api.github.com/users/goragod/gists{/gist_id}","starred_url":"https://api.github.com/users/goragod/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/goragod/subscriptions","organizations_url":"https://api.github.com/users/goragod/orgs","repos_url":"https://api.github.com/users/goragod/repos","events_url":"https://api.github.com/users/goragod/events{/privacy}","received_events_url":"https://api.github.com/users/goragod/received_events","type":"User","site_admin":false},"created_at":"2015-12-03T09:24:31Z","updated_at":"2015-12-03T09:24:31Z","body":"ไม่ต้องสนใจแนวคิดผมสิ เอาแนวคิดเธอล้วนๆ ถ้ามันแก้ปัญหาที่ผมเจอได้ ผมก็พร้อมจะปรับแนวคิด\r\n\r\nตอนนี้ ปัญหาที่น่าจะเจอก็คือ ไม่ว่ายังไงก็ตาม เราก็ยังคงต้องพึ่งพา Libraly ภายนอกอยู่ ยกตัวอย่างเช่น Class ที่เป็นคำถาม ถ้าเราไม่ include เอา config เข้ามา เราจะเอาค่า $key มาใช้ได้ไง (ผมใช้ตัวอย่างนี้เพราะมันมีตัวแปรภายนอกแค่ตัวเดียว ทำให้ง่ายต่อการทำความเข้าใจ)\r\n\r\nในกรณีของ DI มันก็ต้องมีการ เรียกใช้ class จากภายนอกอยู่ดี  (เพื่อเอา config เข้ามา) การแก้ไขค่าของ config ภายในโค้ดโดยตรงไม่น่าเป็นเรื่องดีแน่"}}