Создаем динамические веб-сайты с помощью PHP, MySQL и JavaScript

Печать

Во-первых, не полагаться на встроенное в РНР свойство «волшебных кавычек» (magic quotes), которое автоматически отключает любые символы одинарных и двойных кавычек путем установки перед ними символа обратного слэша (\). Почему? Да потому, что это свойство может быть отключено. Многие программисты именно так и делают, для того чтобы вставить собственный код, обеспечивающий безопасность. Поэтому нет никаких гарантий того, что на вашем рабочем сервере это свойство не было отключено. Фактически в РНР 5.3.0 его использование не приветствовалось, а из РНР 6.0.0 оно вообще было удалено.

Вместо этого для всех обращений к MySQL нужно всегда использовать функцию mysq1_real_escape_string. В примере 10.18 показана функция, которую можно использовать, для того чтобы удалить любые «волшебные кавычки», добавленные во введенную пользователем строку, а затем соответствующим образом обезвредить все имеющиеся в ней опасные компоненты.

Пример 10.18. Способ обезвреживания данных, введенных пользователем, приемлемый для MySQL

<?php

function mysql_fix_string($stri ng) {

if (get_magic_quotes_gpc()) Sstring = stripslashes(Sstring); return mysql_real_escape_string($string);

}

Функция getjnagic_quotes_gpc возвращает TRUE, если свойство «волшебных кавычек» находится в активном состоянии. Если это так, любые добавленные к строке слеши подлежат удалению, в противном случае функция mysql_real_ eascape_string может отключить некоторые символы дважды, сделав строки непригодными для дальнейшего использования. В примере 10.19 показано, как можно вставить функцию mysql_fix в ваш код.

Пример 10.19. Способ безопасного доступа к MySQL при использовании данных, введенных пользователем

<?php

Suser = mysql__f i x_st ri ng( $_P0ST[' user' ]):Spass = mysq^_fix_string($_POST[,pass,]);

Squery = "SELECT * FROM users WHERE user='$user' AND pass='$pass'";

functi on mysql_fi x_stri ng(Sstring) {

if (get_magic_quotes_gpc()) Sstring = stripslashes(Sstring); return mysql jreal_escape_string($string);

}

Следует запомнить, что функцию mysql_escape_string можно использовать только при активной базе данных MySQL, в противном случае произойдет ошибка.