У меня есть запрос
$sql ="SELECT CustomerID FROM tblCustomer
WHERE EmailAddress = '".addslashes($_POST['username']) ."' AND Password = '".addslashes($_POST['password']) ."'";
// while printing, it will be
SELECT CustomerID FROM tblCustomer WHERE EmailAddress = 'test@ab\'c.com' AND Password = '123'
если мы выполняющий это в mysql сервере это работает, но не в SQL-сервере
каково решение для этого?. Я использую SQL-сервер
addlashes ()
избегает одинарных кавычек с начальным обратным слэшем, что является допустимым синтаксисом в MySQL, но не в MS SQL Server. Правильный способ избежать одинарной кавычки в MS SQL Server - использовать другую одинарную кавычку. Используйте mysql_real_escape_string ()
для MySQL ( mysql_escape_string ()
устарел). К сожалению, аналогичной функции mssql_
не существует, поэтому вам придется откатить свою собственную, используя str_replace ()
, preg_replace ()
или что-то подобное. Еще лучше использовать нейтральный уровень абстракции базы данных, такой как PDO, который поддерживает параметризованные запросы.
Для MySQL вы хотите использовать mysql_real_escape_string
. добавляет косые черты
делает почти то же самое и имеет меньше букв, но, видимо, он ошибается - не используйте его.
Для SQL Server это немного сложнее, поскольку (1) MySQL цитирует данные нестандартно, и (2) я не вижу функции, созданной для цитирования материалов для SQL Server. Однако следующее должно сработать для вас ...
$escaped_str = str_replace("'", "''", $unsafe_str);
для mysql
USE mysql_real_escape_string
http://php.net/manual/en/function.mysql-real-escape-string.php
например:
// Query
$query = sprintf("SELECT * FROM tblCustomer WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
для mssql
посмотрите ответы здесь:
Вы не должны создавать SQL-запрос динамически, так как это опасно (и не нужно). Правильнее всего использовать параметризованный запрос, см. http://msdn.microsoft.com/en-us/library/cc296201%28SQL.90%29.aspx
$sql ="SELECT CustomerID FROM tblCustomer WHERE EmailAddress = ? AND Password = ?";
$stmt = sqlsrv_query( $conn, $sql, array($_POST['username'], $_POST['password']));
Это гораздо безопаснее и позволяет не беспокоиться об экранировании символов. Еще один момент - остерегайтесь сравнений с учетом регистра и без учета регистра. Например, если вы хотите, чтобы адрес электронной почты не учитывал регистр, а пароль учитывал регистр, используйте что-то вроде:
$sql ="SELECT CustomerID FROM tblCustomer WHERE EmailAddress = ? COLLATE SQL_Latin1_General_CP1_CIAI AND Password = ? COLLATE SQL_Latin1_General_CP1_CSAS";