맞아요, 숫자 리터럴을 인용 할 필요는 없습니다. 그러나 나는 그것이 자주하는 것을 본다.
숫자 리터럴을 인용 할 때 단점도 없습니다. 예를 들어 INT 열과 비교하거나 산술 표현식에서 사용되는 경우와 같이 숫자 컨텍스트에서 사용될 때 MySQL은 자동으로 숫자 값으로 변환합니다.
숫자 리터럴을 인용하는 것이 가장 유용한 경우는 응용 프로그램 변수를 SQL 문자열로 삽입 할 때입니다. 예를 들어
:
<?php
$num = $_POST['num'];
$sql = "SELECT * FROM my_table WHERE int_column = $num"; // not safe! SQL injection hazard!
'NUM'매개 변수가 정수 될 것으로 예상된다하더라도 악의적 인 사용자가 별도의 SQL 구문을 포함하는 문자열 매개 변수를 전달하고, 따라서 응용 프로그램을 악용 할 수 있습니다.
수정 프로그램은 real_escape_string()
을 사용할 수 있지만이 경우 변수는 SQL에서 인용 문자열에 포함될 것으로 가정합니다.
<?php
$num = $mysqli->real_escape_string($_POST['num']);
$sql = "SELECT * FROM my_table WHERE int_column = '$num'"; // safer
그러나이 숫자가 아닌 내용을 제거 할, 일반 정수로 숫자 변수를 강제하는 동등하게 안전 할 것입니다 : 그래서 당신은 당신의 SQL 식에 인용 한 다음 이스케이프 된 값을 보간 할 필요가 :
<?php
$num = (int) $_POST['num'];
$sql = "SELECT * FROM my_table WHERE int_column = $num"; // safe too
마지막으로 쿼리 매개 변수를 사용하는 것이 가장 안전합니다. 그렇다면 변수를 인용하거나 따 내지 필요가 없습니다.
나는 숫자가 필요한 열에 문자열을 삽입하는 데 "단점이 없다"는 것에 동의하지 않습니다. 최소한 그것은 마법이 일어나고 있음을 나타내는 의견을 말합니다. IMO 코드 냄새입니다. – Air
@AirThomas, 그것은 마법이 아니며, SQL의 동작을 문서화 한 것입니다. http://dev.mysql.com/doc/refman/5.6/en/type-conversion.html 또한 많은 프로그래밍 언어 (특히 동적 또는 스크립팅 언어)에서 문자열의 숫자 리터럴이 자동으로 변환되는 것은 일반적입니다. 숫자적인 맥락에서. –