문제

그들은 SQL 주입에 덜 취약합니까? mysql_query("SELECT important_data FROM users WHERE password = $password")?

도움이 되었습니까?

해결책

그들은 당신이하는 일보다 더 안전합니다. 귀하의 쿼리는 원시 SQL을 DB에 게시합니다. 이는 매개 변수가 SQL 매개 변수로 취급되지 않고 일반 기존 SQL로 취급 함을 의미합니다.

여기 내가 의미하는 바가 있습니다.

저장된 Prococedure를 사용하면 비밀번호 변수는 SQL이 될 수 없으므로 시스템이 찾고있는 정보의 일부 여야합니다. 당신의 예에서 실제로 DB로 전송되는 것은

사용자 중에서 *에서 password = ( '당신의 암호 여기'-$ password ariable)를 선택하십시오.

사용자 중에서 *를 선택하십시오.

또는 더 나쁘지만 :

사용자 중에서 *를 선택하십시오. 비밀번호 = ( '비밀번호 여기'; 데이터베이스 Database_name -$ password ariable).

입력 매개 변수가 추가 SQL로 실행되지 않기 때문에 비 동력 SQL 저장 프로 시저는이를 허용하지 않습니다.

매개 변수화 된 SQL은이를 처리하지만 기술적으로 저장된 절차는 테이블의 정보에 액세스하는 사용자가 읽기 액세스가 필요하지 않기 때문에 여전히 조금 더 안전합니다. 저장된 절차 만 실행할 수 있어야합니다. 귀하의 필요에 따라 이것은 작용할 수도 있고 그렇지 않을 수도 있습니다.

다른 팁

반드시, 당신은 그 안에 문자열 연결을 할 수 있으며 노출은 동일합니다. 파라미터 변수 (SQL을 생성하기위한 문자열 연결 없음)와 함께 동적 SQL을 사용하면 상당히 잘 보호됩니다.

매개 변수를 사용하고 사용자 입력 값에 대한 문자열 연결을 사용하지 않는 한 SQL 주입의 위험이 없습니다. 저장된 절차는 매개 변수를 사용하도록 권장하기 때문에이 측면에서 약간 "더 안전합니다"입니다. 그러나 절차에서 당신은 같은 일을합니다

EXECUTE 'SELECT important_data FROM users WHERE password = ' + @password

그런 다음 Square 1으로 돌아와 SQL 주입에 매우 취약합니다.

또한 저장된 절차는 아니지만 매개 변수를 사용할 수있는 "준비 된 진술"과 같은 것이 있습니다. 따라서 SQL 주입도 피하는 데 사용할 수 있습니다.

안전한 기술은 없습니다. 기술은 안전하거나 안전하지 않은 방식으로 만 사용할 수 있습니다.

즉, 저장된 절차는 SQL 주입을 허용하기 위해 약간 더 창의적인 코딩이 필요합니다. 내가 알고있는 SQL 데이터베이스 엔진에서 문자열을 연결하는 것을 방해하는 것은 없습니다.

그들이 올바르게 매개 변수화되어 동적 SQL을 수행하지 않는 경우 더 안전하며 실행 계획 재사용의 혜택도 가능합니다.

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