Я настроил веб-сайт, который позволяет пользователю добавлять места к базе данных. Однако я незнаком с regex и таким образом, я не уверен, как позволить символы как апострофы и знаки доллара без них влияющий на базу данных INSERT.
У меня есть форма, которая читается Ajax и обрабатывается с PHP/MySQL, таким образом, существуешь тебя языки, которые имеют их собственные "зарезервированные" символы для различного использования. Реалистично regex должен находиться в моем JavaScript, прежде чем Ajax отправит строку. Я довольно плохо знаком с JavaScript, таким образом, я не уверен, как я пошел бы об этом.
Есть ли шанс, которому кто-то мог помочь с этим, но также и объяснить, как этот regex работает?
С наилучшими пожеланиями, Dan
Обычно, когда вы имеете дело с данными, отправленными пользователями, вы не можете быть достаточно осведомленными. Imo, помещать проверку регулярного выражения в область JavaScript - плохая идея или недостаточная. Вы должны быть уверены, что фильтруете такие данные везде (и в достаточной степени).
Применяемые общие правила фильтрации:
Вам определенно не следует делать это на стороне клиента в Javascript, все, что делается на стороне клиента, подвержено взлому и открывает огромную SQL Injection дыру в безопасности, с которой, предположительно, вы знакомы, раз задаете этот вопрос.
Насколько я знаю, содержимое строки не влияет на Javascript или PHP, поскольку это строка. Ее нужно экранировать перед вставкой в базу данных, посмотрите на функцию mysql_real_escape_string.
Нет необходимости возиться с регулярным выражением. Выполните проверку на последнем возможном шаге, здесь PHP, и используйте подготовленные операторы в хорошо известной и протестированной библиотеке базы данных. Подготовленные утверждения позаботятся о том, чтобы правильно цитировать все, что вы им бросаете.
Хорошим примером является MDB2
Проще говоря, вы хотите использовать подготовленные операторы для части PHP / SQL. С PDO:
try {
$dbh = new PDO($dsn,$user,$password);
$stmt = $dbh->prepare('INSERT INTO users SET username = :user');
$stmt->bindParam(':user',$_POST['user']);
$stmt->execute();
if ($stmt->rowCount == 1) {
//success
} else {
//fail
}
} catch (PDOException $e) { //Unhandled may expose $user/$password
echo 'Database connection failed: ' . $e->getMessage();
}
и $ _ POST ['user']
может быть test '; Пользователи DROP TABLE; -
без проблем
К сожалению, я не совсем помню, как это сделать с помощью JS, но я не рекомендую устанавливать данные с помощью вызовов AJAX (JS отключен, NoScript, больше ясности в браузере и т. Д.)