2011-11-30 3 views
4

나는과 같이, 속성으로 인덱스에 자신의 CRC32 형태의 일부 문자열을 스핑크스 말했다 :PHP의 부족와 MySQL의 CRC32 기능은

sql_query = SELECT [...], CRC32(LOWER(color)) AS color, [...], FROM table 

sql_attr_uint = color 

내가 PHP에가는 몇 가지 측면 검색을 얻으려고 사용자가 위의 colors 중 하나 링크를 클릭 수와 스핑크스가 좁혀 결과, 뭔가 등으로가는 다른 검색 요청을 얻을 것입니다 : MySQL의의 CRC32()가 부호없는 32 비트를 반환하기 때문에

Previous page: 
<h3>Narrow down results:</h3> 
<p><a href="search.php?query=something&color=1678454">Red (11)</a></p> 
<p><a href="search.php?query=something&color=4133605867">Yellow (5)</a></p> 

<?php 
    if (isset($_GET[$name])) 
    { 
     $sphinx->SetFilter('color', intval($_GET['color'])); // <-- Uh-oh 
    } 

    [...] 

    $sphinx->Query($query, 'table'); 
?> 

상황이 여기에 잘못 정수, PHP는 매우 도움이되지 않습니다 suppo rt 및 대문자는 2^31-1입니다. 노란색 위의 링크는 내 문제를 노출시킵니다.

StackOverflow,이 문제를 해결할 수있는 방법은 무엇입니까? 나는 SQL 질의 측면에서 몇 가지 수학을하는 것이 가능하다고 생각하지만, 충돌의 걱정할 가능성을 더욱 악화시키는 것에 조심하고 있습니다.

미리 감사드립니다. PHP의 crc32() manual page에서 인용

+0

유효성 검사를 위해'intval'을 사용한다면 (숫자를 제외하고는 스핑크스로가는 이상한 문자는 없습니다),'filter_var (FILTER_SANITIZE_NUMBER_INT, $ _GET [ 'color']);와 같이 사용하면됩니다. , 플러스 마이너스로 로그인하십시오. –

답변

2

: PHP의 정수형이 체결되어 있기 때문에

, 많은 CRC32 체크섬, 당신은 포맷터 의 sprintf() 또는 printf와의 "U %"를 사용하는 음수에 결과가 필요합니다()를 호출하여 부호없는 crc32 체크섬의 문자열 표현을 가져옵니다. 즉

은, PHP는 큰 정수를 처리 할 수 ​​있지만이 정확한 경우에 당신은 배정 밀도로 부호없는 정수를 에뮬레이션 할 수 있습니다. 문자열로 전송할 때 실제 값을 얻을 수 있습니다.

덧셈이나 곱셈과 같은 수학 연산을 수행 할 필요가 없기 때문에 충분합니다.


업데이트 : 나는 당신의 질문의 중요한 부분을 무시했습니다 같아요. 오히려이보다 :

intval($_GET['color']) 

... 당신은 유효성을 검사하거나 정규 표현식으로 필터링 할 수 있습니다

preg_match('/^\d+$/', $_GET['color']) 
preg_replace('[^\d]', '', $_GET['color']) 

를 ... 그리고 문자열로 CRC 값을 처리합니다.

+0

스핑크스가 그냥 문자열로 가져갈 수 있다는 것을 몰랐습니다. 통찰력에 감사드립니다! – fixception