mysql_real_escape_string () не очищает переменную - PullRequest
4 голосов
/ 07 апреля 2011

Я работаю над существующим веб-сайтом, пытаясь предотвратить инъекции SQL. До того, как $_GET['ID'] был не подвергнут санитарной обработке.

$ID=mysql_real_escape_string($_GET['ID']);
$sQuery=mysql_query("select * from tbl_mini_website as s1, tbl_actor_merchant as me where s1.MERCHANT_ID=$ID AND s1.MERCHANT_ID=me.MERCHANT_ID");

Если я ставлю 'в конце URL, с mysql_real_escape_string() я получаю это от mysql_error():

У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с '\\' И s1.MERCHANT_ID = me.MERCHANT_ID 'в строке 1

без mysql_real_escape_string() Я получаю:

У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с '\' И s1.MERCHANT_ID = me.MERCHANT_ID 'в строке 1

Я не уверен, что с этим? Любая помощь будет принята с благодарностью.

Ответы [ 4 ]

6 голосов
/ 07 апреля 2011

Если это id, числовое значение, я полагаю, почему бы вам просто не привести его к целому числу?

$ID = (int) $_GET['ID'];

Лучший совет, который я могу вам дать, это проверить PDO и использовать связанные параметры.

5 голосов
/ 07 апреля 2011

mysql_real_escape_string сбрасывается, но не заключает в кавычки.

Попытка:

$sQuery=mysql_query("select * from tbl_mini_website as s1, tbl_actor_merchant as me where s1.MERCHANT_ID='$ID' AND s1.MERCHANT_ID=me.MERCHANT_ID");

В более общем смысле, я склоняюсь к тому, чтобы обернуть оба этих элемента в функцию, например:

function quoteValue($value) {
    return "'" . mysql_real_escape_string($value) . "'";
}

Это полезно, потому что вы можете обнаружить, что вам нужно более тонкое поведение при цитировании (особенно когда речь идет об обработке Юникода, управляющих символов и т. Д.)

2 голосов
/ 07 апреля 2011

Это потому, что вы не цитируете переменную.

Вот ваш запрос с учетом следующих входных данных

$_GET['ID'] = "1";
$ID=mysql_real_escape_string($_GET['ID']);
SELECT ... where s1.MERCHANT_ID=1 ...

$_GET['ID'] = "1'"
$ID=mysql_real_escape_string($_GET['ID']);
SELECT ... where s1.MERCHANT_ID=1\' ...

$_GET['ID'] = "1'"
SELECT ... where s1.MERCHANT_ID=1' ...
1 голос
/ 07 апреля 2011

Фил Браун прав, но вы должны забыть о старомодных mysql_real_escape_string or mysql_connect(), так как они очень старые и переходят в PDO php (), где вы можете использовать подготовленные операторы, связывать, извлекать объект и многое другое.

Я предлагаю прочитать документацию PDO по адресу http://php.net/manual/en/book.pdo.php, если вы хотите манипулировать dabatase следующего поколения и обеспечивать безопасность от SQL-инъекций.

...