PHP, MySQL, and PDO – Part 3

이제 데이터베이스에서 데이터를 읽는 방법을 보았습니다 데이터베이스를 보내는 방법을 보았습니다

delete 및 insert와 같은 명령을 사용하면 데이터베이스에 항목을 추가하고 제거 할 수 있습니다 하지만 아마 그냥, 나는 조금 헐렁한 것을하고 있었고 우리가해야 할 일들에 대해서 확실히 이야기하고 싶습니다 사용자의 데이터를 가져 와서 코드 내에서 사용할 때 걱정할 필요가 없습니다 그래서, 여러분이 회상한다면, 우리는 HTML 삽입에 대해 이야기했습니다 HTML 삽입 문제는, 고의 또는 의도하지 않은 의도가있는 사용자가 합법적 인 HTML을 양식 태그에 넣기 시작하면 생각없이 그들은 백그라운드 문서를 넘겨 줄 수 있습니다

그리고 대개 그들은 단지 '죽어라', '죽어라', '죽는다'라는 단어를 내놓는 것이 아닙니다 그들은 JavaScript와 같은 것을 넣고 있습니다 그리고 원시 사용자 입력을 내보내는 경우 브라우저는이를 다른 방식으로 구문 분석합니다 브라우저는이 비트가 사용자로부터 왔음을 인식하지 못하고 문제가됩니다 따라서 데이터를 정리하지 않으면 위험합니다

그리고 물론 그 해결책은 HTML Entities입니다 그러면 HTML Entities가 HTML Entities로 바뀝니다 앰퍼샌드 따옴표 및 우리가 이전에 말했던 모든 다른 것들 SQL 주입과 비슷한 문제가 있습니다 사용자가 무언가를 입력 할 수 있다는 생각입니다

이것은 PHP에서 거대한 문제로 판명되었습니다 잘못된 일을 PHP에서 편리합니다 PHP를 시작하는 개발자는 초창기 개발자들이 선호하는 언어입니다 그래서 실수하기 쉽지, 알았지? 그래서 PHP는 매우 불안한 ​​평판을 얻었습니다 PHP의 잘못이 아니기 때문에 PHP는 안전하지 못하게 막을 수있었습니다

그리고 우리가 이전에 이야기했던 것처럼, PHP는 당신이 책임감있는 프로그래머라고 기대하는 언어입니다 실제로 PHP 4에서이 문제를 해결하기 위해 어리석은 일을했습니다 그것은 정말로 나빴다 그리고 그들은 그것을 취소했습니다 하지만 내가 보여줄 PDO에는 행복한 결말이 있습니다

그들은 마침내 PHP5에서 이것을 알아 냈습니다 그러나 그들은 PHP 4에서 그것을 고치려고 노력했고 나쁜 일을했습니다 [SOUND] 기존 코드에서 스트립 슬래시 같은 것을 보면, 그렇다면 당신은 HTML 주입의 어둠의 시대에서 왔습니다 하지만 SQL 인젝션은 폼 필드와 데이터베이스에 나쁜 일을하십시오 그럼, 당신이 그 두 단계 과정을하고 싶지 않다고 말하자

나는 준비를하고 두 단계로 실행합니다 그것은 좋은 습관입니다 하지만 와우, PHP는이 달러 기호를 내부에서 사용할 수있는 훌륭한 능력을 가지고 있다고 말합니다 큰 따옴표 방금 이렇게했다면 위대하고 간단하지 않겠습니까? 방금 선택 문을 큰 따옴표로 사용했습니다 그리고 나서이 가변 달러 $ e에 전자 메일을 가져옵니다

그것의 암호 그리고 여기에 작은 따옴표를 넣으십시오 그러면 양식 필드에서 바로 물건을 넣을 수 있습니다 이 SQL에 들어가면 SQL을 실행할 것입니다 나쁜, 나쁜, 나쁜, 나쁜 것입니다

정말 사악 해, 알았지? 그래서, [LAUGH] 무슨 일이 일어나는지 보여 드리죠, 알았죠? 문제는 우리가 최종 사용자가 입력 한 물건을 가져 가고 있으며 그 다음에 작업을 수행 할 수 있다는 것입니다 그들은 우리 SQL을 대신 할 수 있습니다 그리고 우리의 SQL을 인수하는 것은 더욱 심각합니다 그때 그들은 우리의 전체 데이터베이스에 침입 할 수 있습니다 쿠키가 HTML에 침투하면 쿠키를 훔칠 수 있습니다

하나 또는 몇 명의 사용자가 그 정보를 포착 할 수 있습니다 그러나 데이터베이스에는 그들이 있고, 모든 것을 갖추고 있습니다 데이터베이스 암호를 가져올 수 있고 암호가 들어있는 경우 데이터베이스에서 일반 명령을 실행하면 심오한 문제가 발생합니다 그래서 SQL 인젝션은 어떤면에서는 더 나쁘다 어느 것이 든 좋은 것은 아니지만 HTML 주입보다 더 나쁩니다

여기서 일어나는 일을 보도록하겠습니다 여기에 작은 사용자 테이블이 있다고 가정 해 봅시다 그래서 우리는 사용자 아이디를 가지고 있으며 패스워드, 등등을 가지고 있습니다 그래서 우리는 사람의 이메일을 입력합니다 그리고 우리는 잘못된 암호를 입력하고 우리는 로그인을 제출합니다

그리고 그것은 기본적으로, 그 코드를 사용하여 방금 여러분에게 보여 줬습니다, email = csev@unichedu이고 password = wrong 인 사용자로부터 이름을 선택합니다 단순히이 두 값을 가져 와서 문자열에 집어 넣었습니다 맞습니까? 그리고 나서 그것을 선택합니다 기록이 없다면 로그인하지 않았다고 말하는거야? 이메일과 비밀번호가 일치하지 않습니다

꽤 괜찮 았지, 그렇지? 잘 작동했습니다 그것은 사람들을 기록하는 빠른 방법입니다 당신은 질의를하고 네가 행을 가지고 있는지 확인하고 네가 행을 얻지 못했다면 그 행을 기록하지 말라 당신이 행을 얻었 으면, 당신은 그들을 기록 할 수 있습니다 그것은 로그인의 작동 방식입니다

좋아, 그럼 뭐가 잘못 될 수 있니? 그래서 나는 악을 행하지 않았다 이 주사 공격에 대한 아이디어는 네가 무언가를 할 거라는거야 이러한 형태의 악마는 SQL에 몰래 넣고 나쁜 일을 할 수 있습니다 자, 여기 XKCD 만화가 있습니다 그것은 매우 중요한 만화입니다 SQL 인젝션에 대한 표준 만화입니다

내가 너에게 읽어 줄께 그래서 엄마가 있고 학교에 전화를하고 있습니다 그녀는 인사를합니다 아니면 학교에서 엄마 한테 전화하고 이렇게 말하면, 네 아들 학교 야 컴퓨터에 문제가 생기고 엄마가 자기가 무언가를 망 쳤어? 그리고 학교는 어떤 식 으로든 말합니다

그리고 학교에서 아들의 이름을 말 했니? Robert '); DROP TABLE 학생; -? 그게 학교 야 그리고 엄마는 물론, 우리는 그에게 바비 테이블 (Bobby Tables)이라는 작은 이름을지었습니다 그리고 학교는 말한다, 우리는 올해의 학생 기록을 잃어 버렸다 네가 행복하기를 바란다 그리고 엄마는 매우 기술적으로 기민한 엄마가 말한다

데이터베이스 입력을 위생 처리하는 방법을 배웠 으면합니다 또는 나는 말할 것이다, SQL 인젝션을 피하고 그것을 피하는 법을 배웠 으면 좋겠습니다 그것이 PDO를 사용하는 법을 배웠 으면 좋겠습니다 당신의 질의를하기 위해 문자열 대체를하기보다는 오케이? 또는 문자열 대체 대신 명령문을 준비하십시오 자, 이건 재미 있고 모두가 이걸 좋아합니다

한 번 로그인 이름을 null로 변경 한 학생을 만났습니다 필드에 넣는 재미있는 또 다른 것은 null입니다 cuz null은 키워드입니다 그래서 당신의 이름이 NULL이지만 잘못된 장소에서 사용한다면, 어떤 것은 null에 대해 다르게 행동 할 것입니다 그래서 저는 실제로 이것을 시도한 사람들을 만났습니다

인터넷에 사람들이 만드는 것들이 있습니다 세미콜론 드롭 테이블 트래픽이나 뭐 그런 식의 번호판 컴퓨터가 이걸 읽고 텍스트를 이미지 처리하고 잘하면 그들이 무엇이든간에 데이터베이스를 포맷 할 것입니다 그러나 당신은 아이디어를 얻습니다 좋아, 농담이야 나는 아마 너를 위해 그것을 망쳤다 나는 단지 농담을 잘하는 농담이 아니다

그러나 중요한 것은 작은 따옴표를 사용하기 때문에이 작은 따옴표를 넣는 것입니다 활성 캐릭터이며, 이들은 이것이 어떤 SQL에있을 것으로 기대하고있다 그러면이 작업이 끝나고 두 번째 SQL 명령을 실행하게됩니다 세미콜론은 SQL에서 보았 듯이, 동일한 행에서 둘 이상의 명령을 실행할 수 있습니다 자, 그들이이 특별한 것을 택한 것으로 밝혀졌습니다

즉, PDO 세미콜론을 하나의 쿼리로 존중하지 않습니다 그래서 그들은 이것을 고쳐주었습니다 이걸 할 수는 없습니다 가능하다면 재미 있겠지만 근대 PDO와 현대 데이터베이스는 그들은이 일이 너무 나쁘다고 생각하지 않습니다 그러나 우리는 여전히 나쁜 일을 할 수 있습니다

그리고 그들이 이걸 알아내는 방법이 있습니다 그리고 우리가 어떻게 이것을 가지고 있는지 여기에서 기억하십시오 우리는이 성명서를 작성하고 나서 우리는하려고합니다 사용자가 무엇을 입력 하든지, 바로 거기에 넣을 것입니다 그리고 만약 내가 들어가면 p "OR 1 = 1"을 의미합니다

그래서 나는 지금 수정하지 않고, 이 비트를 여기 넣었습니까? 그리고 닫힌 견적이 아닙니다 죄송합니다 다시 시작하겠습니다 이 권리를 갖자 p에서 1이지만 따옴표는 없습니다

따라서 두 따옴표는 원래 SQL의 일부입니다 HTML 삽입과 마찬가지로 SQL이 어떻게 보이는지는 아닙니다 그것은 암호를 말합니다, 그것은 이메일 cszv@unichedu와 암호는 p 또는 1 = 1, 우물 1 = 1은 항상 참일 것입니다 그래서 이것은 항상 사실 일 것입니다, 그래서 비록 내가 암호를 모르더라도, 나는 로그인했다

정말 나쁜 일을하기 위해 세미콜론 트릭을 사용할 수 없습니다 그게 더 재미있을거야, 여기 테이블을 떨어 뜨리는 게 재미있을거야 당신은 할 수 없습니다 왜냐하면 그것은이 문자열에서 보이지 않기 때문에, 세미콜론은 해당 문자열에서 존중되지 않습니다 비록 당신이 phpMyAdmin을 할 때 그들은 존경 받지만, 여기서 PDO 쿼리를 수행 할 때, 그것은 매우 위험하기 때문에 세미콜론을 사용하지 않을 것이라고 생각합니다

그래서 두 개의 세미콜론을 넣으라고 말할 수 있습니다 기본적으로 세미콜론을 사용하지 않습니다 그러나 이것이 SQL이 없다는 것을 의미하지는 않습니다 위생 처리 또는 적절하게 처리하는 것 그들이 원하는 것은 그들이 침입하여 파악하려는 것입니다

관리자 계정에 로그인하고 관리자 계정으로 모든 종류의 작업을 시작하십시오 또는 비밀번호가 무엇인지 파악하거나 관리자 비밀번호가 무엇인지 파악하십시오 비밀리에 로그인하여 데이터베이스 암호가 무엇인지 파악하십시오 그래서 XKCD가 원하는 방식으로 테이블을 떨어 뜨릴 수는 없지만 드롭 테이블 이제 나쁜 소식입니다

PHP 5 이전에는 이것을 수행하는 방법에 대한 자세한 설명이있었습니다 하지만 PHP 5와 PPO에서는 이것이 제가 좋아하는 이유 중 하나입니다 PDO 이외의 것을 사용하지 마십시오 내가 이미 당신에게 패턴을 보여 줬다는 진술, 완벽하게 않습니다 그리고 여기서 일어나는 일은, 이메일과 암호가있는이 작은 장소가 있습니다

하지만이 작은 자리 표시 자만 있습니다 우리는 실제로 텍스트를 넣지 않습니다 그리고 준비는 이 작은 자리 표시자를 찾은 다음 사용자 데이터에 넣습니다 그러나이 실행의 행위에서, 그것을 적절하게 벗어나기 위해이 일을하고 있습니다 HTML 엔티티가 HTML에 대해 수행 한 작업과 비슷합니다

우리는 그것을하지 않는다는 것을 제외하고는, 우리는 이것이 작동한다는 것을 알고 있습니다 이것으로 고통받을 수 없다는 것을 의미하며, 이 작업을 수행하는 경우 전자 메일 및 암호를 사용하여 SQL 주입을 수행 할 수 없습니다 준비된 문은 데이터를 자동으로 이스케이프하므로 데이터를 탈출 할 필요조차 없습니다 초기에는 PDO 이전의 PHP 5 이전 버전의 MySQL 밑줄 루틴에서, 우리는 HTML 엔티티와 비슷한 이러한 탈출 루틴을 모두 가지고있었습니다 그러나 그들은 다소 추했습니다

당신은 방금 준비된 문장을 사용했고, 문장의 끝은 SQL injection을 가지고 있지 않습니다 최종 사용자 데이터를 포함하여 함께 연결하기 시작하면, 그럼 곤경에 빠졌지, 그렇지? 최종 사용자로부터 온 것들을 함께 연결하지 마십시오 준비된 문장을 사용하면 추가 라인이됩니다 그것은 우아하고, 간단합니다, 그것은 당신의 SQL을 예쁘게 만듭니다 못생긴 연결을하고 있지 않습니다

그리고 너무 멀리 간다 알았지? PDO를 사용하고, 삽입, 삭제 등을 사용할 때 준비된 문을 사용하십시오 사용자 데이터를 넣는 것이라면이 작은 자리 표시자를 사용해야합니다 선택 항목을 포함하여 선택 항목에 WHERE 절이있을 수 있습니다 어디 이름 = 또는 전자 메일 =

글쎄, 이건 선택인가? 이쪽은 선택입니다 이것이 선택 일지라도, 괜찮습니다 우리는 문제가 될 수 있습니다 select 문에서 사용자 입력을 제대로 벗어나지 못하는 경우 그래서, 다음에 우리는 무엇이 잘못 될지에 대해 조금 더 이야기 할 것입니다

이것은 SQL 인젝션에 관한 것이 아니라 우리가 방금 끝낸 얘기입니다 SQL에 구문 오류가있는 경우에 대해 자세히 설명합니다 따라서 select를 올바르게 입력 할 수 없거나 존재하는 필드를 사용합니다 그래서 조금 까다 롭고 PDO 오류 처리 방법에는 많은 유연성이 있습니다 우리가 PDO를 설정할 때 이전 일의 시작 부분에서 이것에 대해 이야기했습니다

PHP, 그러나 이제 우리는 좀 더 자세하게 살펴볼 것입니다 [음악]