Следующий код представляет собой предложение метода санитарии при передаче данных в удаленную базу данных через SQL и PHP.
$name = strtr(mysqli_real_escape_string($connector_obj, $_POST['name']), '/\\', ' ');
Мой вопрос заключается в том, будет ли оператор MSQLI очищать входные данные, а затем добавляется оператор strtr, делая код все еще безопасным, или поле все еще уязвимо? Эта очистка происходит после начального запроса, поэтому другой вариант — передать очищенную базу данных, а затем выполнить операцию strtr после факта, чтобы вывести информацию на страницы, обращенные к клиенту.
На более высоком уровне, насколько внимательны пользователи к слешам в экранированных строках MSQLI? Я думаю, что это выглядело бы немного менее привлекательно и дало бы представление о структуре приложения для лиц с дурной репутацией, но любой вклад в идею был бы оценен.
mysqli_real_escape_string
только ускользает от персонажей. Это не дезинфицировать.
Когда значение опубликовано, это время для очистки.
Я предпочитаю использовать целочисленные значения. Вместо адреса электронной почты в качестве имени пользователя я запрашиваю номер телефона. Затем используйте регулярное выражение, чтобы удалить все, кроме числовых значений.
$number = preg_replace('/[^\d]/','',$_POST['number']);
Если я ищу целое число без пробелов, запятых, тире, я просто использую:
$number = intval($_POST['number']);
Вы должны квалифицировать значения, используемые в запросе.
$sql = sprintf("SELECT * FROM `Client` WHERE `Number` = %d", $id);
Я также смотрю на все, что представлено. Поиск символов и слов, которые обычно используются в атаках SQL-инъекций.
$strike1 = 1 + preg_match_all('/\x3F/',$SAVE_ID,$matches, PREG_SET_ORDER); // )
$strike2 = preg_match_all('/[\x21-\x2F]|[\x3A-\x40]|[\x5B-\x60]|[\x7B-\x7F]/',$SAVE_ID,$matches, PREG_SET_ORDER);
$strike3 = preg_match_all('/\x28/',$SAVE_ID,$matches, PREG_SET_ORDER); // )
$strike4 = preg_match_all('/\x29/',$SAVE_ID,$matches, PREG_SET_ORDER); // (
$strike5 = preg_match_all('/COALESCE|0x|like|regex|mid|select|delete|drop|insert|do|call|replace|update|infile|lock|set|from|into|show|table|kill|reset/i',$SAVE_ID,$matches, PREG_SET_ORDER);
Когда я вижу слишком нарушения, я блокирую IP-адрес.
@mysql_unbuffered_query("INSERT INTO `Banned` (`ip`, `TimeStamp`,`Strike3`, `Attributes`) VALUES ('$ip', CURRENT_TIMESTAMP, $alert);");
Я также слежу за ошибками пароля. Если я вижу слишком много неудачных попыток за короткий промежуток времени или промежуток между попытками слишком короткий (не человеческий), я запрещаю IP.
Других решений пока нет …