MySQL/PHP- 내 데이터베이스 속도를 늦출 수있는 캐릭터 도피 (또는 예기치 않게 수행하도록)

StackOverflow https://stackoverflow.com/questions/339180

문제

나는 모든 정수를 a (int)Integer 내 쿼리 문자열에서 안전하게 사용하도록합니다.

또한이 기능 코드를 통해 문자열을 실행합니다.

if(!get_magic_quotes_gpc()) {
           $string = mysql_real_escape_string($string);
        }

$pattern = array("\\'", "\\\"", "\\\\", "\\0");
$replace = array("", "", "", "");
if(preg_match("/[\\\\'\"\\0]/", str_replace($pattern, $replace, $string))) $string = addslashes($string); 


$cleanedString = str_replace('%','',$string);

나는 분명히 $ cleanedstring 변수를 반환합니다. 이제 MySQL의 와일드 카드이기 때문에 % 문자를 교체하고 사용자가 삽입 한 경우 쿼리 속도를 늦출 수 있습니다 (또는 잘못된 데이터를 반환 할 수 있음). 내가 걱정해야 할 MySQL에 대한 다른 특수 캐릭터가 있습니까?

두 번째 참고로, 내 검색에 대해 잘못되거나 중복되는 것이 있습니까? mysql_real_escape_string? 처음 시작할 때 웹 사이트에서 얻었고 (정확하게 기억한다면) 탈출 문자열 외에이 검색/교체를 사용해야한다고 말했습니다. 이전에 탈출 한 주사 문자를 제거하려는 것 같습니다.

도움이 되었습니까?

해결책

네, 당신이 조금 이상하게 진행되는 것 같아요.

우선, 나는 마법 인용문을 확인하고 제거하다 슬래시가 켜지면. 그렇게하면 실제로 원하는 정보를 나타내는 문자열이 있습니다 (슬래시로 취급 된 정보가 아닙니다).

특히 % 와일드 카드를 제거하려면 탈출하거나 완전히 제거 할 수 있습니다. 문자열을 SQL 쿼리에 삽입하기 전에 마침내 mysql_real_escape_string을 통해 실행하면 모든 것이 정상입니다.

$string = $_POST['searchTerm'];
if (get_magic_quotes_gpc()) {
    $string = stripslashes($string);
}
$string = str_replace("%", "", $string);
$safeString = mysql_real_escape_string($string);

다른 팁

좋아, 몇 가지 댓글이 있습니다.

  • 마법 인용 기능은입니다 감가 상각 된, PHP 환경은 마법 인용문을 사용하지 않아야합니다. 따라서 점검은 (비정상적으로) 마법 인용구를 활성화 한 다른 고객 환경에 배치 될 수있는 코드를 설계하지 않는 한 불필요해야합니다.

  • 당신의 정규 표현 preg_match() 캐릭터 시퀀스를 검색하는 경우 부정확합니다. 정기적 인 표현 [xyz] 일치합니다 하나 단일 문자 x, y 또는 z의. 문자열 xy 또는 yz와 일치하지 않습니다. 어쨌든, 이것은 당신이 이런 식으로 특수 문자를 검색하거나 교체 할 필요가 없다고 생각하기 때문에 학문적입니다.

  • mysql_real_escape_string() SQL 문자열로 인용문을 보간하려는 문자 리터럴을 피하기에 적합합니다. 다른 따옴표, 백 슬래시 등에 대한 문자열 대체 할 필요가 없습니다.

  • % 그리고 _ SQL의 와일드 카드입니다 패턴 매칭을 사용할 때 LIKE 표현. 이 캐릭터는 평등이나 불평등 운영자 또는 RegexP와 비교하는 경우 의미가 없습니다. 당신이 사용중인 경우에도 LIKE 표현, SQL 주입에 대한 방어를 위해 이러한 캐릭터를 피할 필요가 없습니다. 문자 그대로의 캐릭터 (즉, 백 슬래시로 탈출) 또는 와일드 카드로 취급하고 싶다면 그것은 당신에게 달려 있습니다. LIKE 표현식 (이 경우 그냥 남겨 둡니다).

  • 위의 모든 내용은 문자 그대로 문자열 값 대신 SQL 표현식으로 PHP 변수를 보간 할 때 적용됩니다. 사용하는 경우 탈출이 전혀 필요하지 않습니다 바인딩 쿼리 매개 변수 보간 대신. 바운드 매개 변수는 일반 "MySQL"API에서 사용할 수 없지만 "MySQLI"API에서만 사용할 수 없습니다.

  • 또 다른 경우는 SQL 테이블 이름, 열 이름 또는 기타 SQL 구문 대신 PHP 변수를 보간하는 곳입니다. 그러한 경우에는 바운드 매개 변수를 사용할 수 없습니다. 바인딩 매개 변수 문자열 리터럴을 대신하십시오. 열 이름을 동적으로 만들어야하는 경우 (예 : ORDER BY 사용자 선호도의 열)) 열 이름을 구분하십시오 백 크기 (MySQL) 또는 사각형 브래킷 (Microsoft) 또는 이중 인용물 (기타 표준 SQL).

그래서 나는 당신의 코드를 다음과 같이 단순히 줄일 수 있다고 말할 것입니다.

$quotedString = mysql_real_escape_string($string);

그게 만약에 보간을 위해 문자열을 사용할 것입니다. 바운드 매개 변수 값으로 사용하려면 더 간단합니다.

$paramString = $string;

mysql_real_escape_string () 이이 문자를 당신을 위해 탈출합니다.

x00, n, r, , ', "및 x1a

그래서 당신은 그들을 스스로 탈출 할 필요가 없습니다. 마법 따옴표가 켜져 있으면 슬래시를 제거한 다음 mysql_real_escape_string ()을 사용하는 것이 좋습니다.

if(get_magic_quotes_gpc()) {
    $string = stripslashes($string);
}

$string = mysql_real_escape_string($string);

$cleanedString = str_replace('%','',$string);

또한 MySQL의 밑줄은 단일 캐릭터의 와일드 카드이므로 그에 대해 무언가를하고 싶을 수도 있습니다.

SQL 주입 문제가 실제로 걱정된다면 준비된 진술을 사용하여 강력히 고려해야합니다. 사용자 데이터가 제공되기 전에 SQL 문이 평가되므로 코드가 훨씬 안전합니다.

pdo 및 mysqli를 참조하십시오

두 번째 요점에서 :
MySQL_Real_Escape_string ()을 통해 실행하면 모든 문자가 올바르게 탈출되었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top