복붙노트

문자열을 벗어나는 것이 무슨 뜻입니까?

PHP

문자열을 벗어나는 것이 무슨 뜻입니까?

내가 읽은 SQL 쿼리에 들어가기 전에 $ _SESSION [ 'username']을 이스케이프 처리해야합니까? 그리고 "당신은 원점에 관계없이 SQL 질의에 전달하는 모든 문자열을 이스케이프해야한다"고 말했다. 이제 저는이 같은 것이 정말로 기본적인 것임을 압니다. Google 검색 결과가 20,000 개가 넘었습니다. Stackoverflow만으로는 20 페이지의 결과가 있었지만 아무도 실제로 문자열을 이스케이프 처리하는 방법이나 처리 방법을 설명하지 못했습니다. 방금 가정합니다. 너 나 좀 도와 줄 수있어? 항상 PHP로 웹 앱을 만들고 있기 때문에 배우고 싶습니다.

나는 보았다 : 이스케이프 문자 삽입, Java의 모든 이스케이프 문자는 무엇입니까? CCS는 addcslashes ()를 사용하여 문자열을 이스케이프 처리합니다. 이스케이프 문자, mysql_real_escape_string ()이 실제로하는 일은 무엇입니까? PHP에서 문자열의 큰 따옴표를 어떻게 피할 수 있습니까? MySQL_real_escape_string은 슬래시를 추가하지 않습니까?, PHP에서 문자열에서 이스케이프 시퀀스를 제거 할 수 있지만 계속 당신이 요점을 얻을 확신합니다. 이것은 게으름이 아닙니다.

해결법

  1. ==============================

    1.문자열을 이스케이프한다는 것은 해당 문자열에 사용 된 따옴표 (및 기타 문자)의 모호성을 줄이는 것을 의미합니다. 예를 들어, 문자열을 정의 할 때 일반적으로 문자열을 큰 따옴표 나 작은 따옴표로 묶습니다.

    문자열을 이스케이프한다는 것은 해당 문자열에 사용 된 따옴표 (및 기타 문자)의 모호성을 줄이는 것을 의미합니다. 예를 들어, 문자열을 정의 할 때 일반적으로 문자열을 큰 따옴표 나 작은 따옴표로 묶습니다.

    "Hello World."
    

    하지만 내 문자열에 큰 따옴표가 있으면 어떻게 될까요?

    "Hello "World.""
    

    이제는 모호성이 있습니다. 통역사는 제 문자열이 끝나는 곳을 알지 못합니다. 내 큰 따옴표를 유지하려면 몇 가지 옵션이 있습니다. 내 문자열 주위에 작은 따옴표를 사용할 수 있습니다.

    'Hello "World."'
    

    아니면 따옴표를 벗어날 수 있습니다.

    "Hello \"World.\""
    

    슬래시 앞에 오는 모든 인용문은 이스케이프 처리되며 문자열 값의 일부로 인식됩니다.

    쿼리와 관련하여 MySQL은 혼란을주지 않고 쿼리에서 사용할 수없는 특정 키워드를 가지고 있습니다. 열의 이름이 "Select"인 값의 테이블이 있다고 가정하고 그 테이블을 선택하려고했습니다.

    SELECT select FROM myTable
    

    이제 쿼리에 약간의 모호성이 추가되었습니다. 우리의 질의 내에서, 우리는 back-tick을 사용하여 그 모호성을 줄일 수 있습니다 :

    SELECT `select` FROM myTable
    

    이렇게하면 필드 이름을 잘못 선택하여 혼동을 피할 수 있습니다.

    이것의 많은 것들은 mysql_real_escape_string ()을 통해 값을 단순히 전달함으로써 처리 될 수 있습니다. 아래 예제에서이 함수를 통해 사용자가 제출 한 데이터를 전달하여 쿼리에 문제가 발생하지 않는지 확인할 수 있습니다.

    // Query
    $query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
                mysql_real_escape_string($user),
                mysql_real_escape_string($password));
    

    add_slashes, addcslashes, quotemeta 등과 같은 문자열 이스케이프를위한 다른 방법이 있지만 안전한 쿼리를 실행하는 것이 목표 인 경우 큰 개발자는 mysql_real_escape_string 또는 pg_escape_string (PostgreSQL의 컨텍스트에서)을 선호합니다.

  2. ==============================

    2.일부 문자는 사용중인 SQL 데이터베이스에 특별한 의미가 있습니다. 이러한 문자가 쿼리에 사용될 때 공격자가 데이터베이스를 손상시키는 것을 허용하는 등의 예기치 않은 및 / 또는 의도하지 않은 동작이 발생할 수 있습니다. 이러한 문자가 이스케이프 처리되거나 다른 방식으로 처리되어야하는 방식으로 이러한 문자가 쿼리에 영향을 미치지 않도록하려면이 쿼리에서 특수 문자로 처리하지 않도록 데이터베이스에 지시해야합니다.

    일부 문자는 사용중인 SQL 데이터베이스에 특별한 의미가 있습니다. 이러한 문자가 쿼리에 사용될 때 공격자가 데이터베이스를 손상시키는 것을 허용하는 등의 예기치 않은 및 / 또는 의도하지 않은 동작이 발생할 수 있습니다. 이러한 문자가 이스케이프 처리되거나 다른 방식으로 처리되어야하는 방식으로 이러한 문자가 쿼리에 영향을 미치지 않도록하려면이 쿼리에서 특수 문자로 처리하지 않도록 데이터베이스에 지시해야합니다.

    mysql_real_escape_string ()의 경우 \ x00, \ n, \ r, \, '및 \ x1a를 이스케이프 처리합니다. 이스케이프 처리되지 않은 경우 MySQL 데이터베이스에서 SQL 주입을 포함하는 앞에서 언급 한 문제가 발생할 수 있습니다.

  3. from https://stackoverflow.com/questions/10646142/what-does-it-mean-to-escape-a-string by cc-by-sa and MIT license