Я сделал простой поисковый скрипт в PHP, который ищет базу данных mySQL и выводит результат. Как это работает:
GET
этот поиск и оздоравливает его. SELECT
и LIKE
, получает результаты. Я бы хотел спросить, правильно ли я это делаю?
Вот как я дезинфицируюсь перед SELECTING
из базы данных:
if(isset($_GET['q'])){ if(strlen(trim($_GET['q'])) >= 2){ $q = trim(mysql_real_escape_string(addcslashes($_GET['q'], '%_'))); $sql = "SELECT name, age, address FROM book WHERE name LIKE '%".$q."%'"; } }
И вот как я убегаю, прежде чем выводить «результат возврата джека».:
echo htmlspecialchars(stripslashes($q)) . " returned x results.";
Это правильный способ сделать это?
Кстати, я знаю, что PDO и mySQLi предпочтительнее, поскольку они санируют себя с помощью подготовленных заявлений, но у меня нет никакого реального опыта с ними. Но я бы с радостью посмотрел, если вы, ребята, могли бы связать мне несколько учебников / объяснений новичков. Кроме того, я слышал, что magic_quotes
и charset
могут каким-то образом привести к инъекциям – это правильно?
По какой-то причине нам также нужно избегать обратной косой черты .
Итак, правильный код будет, я считаю
if(isset($_GET['q'])){ $_GET['q'] = trim($_GET['q']); if(strlen($_GET['q']) >= 2){ $q = $_GET['q']; $q = '%'.addCslashes($q, '\%_').'%'; // now we have the value ready either for escaping or binding $q = mysql_real_escape_string($q); $sql = "SELECT name, age, address FROM book WHERE name LIKE '$q'"; //or $sql = "SELECT name, age, address FROM book WHERE name LIKE ?"; $stm = $pdo->prepare($sql); $stm->execute(array($q)); $data = $stm->fetchAll(); } }
-if(isset($_GET['q'])){ $_GET['q'] = trim($_GET['q']); if(strlen($_GET['q']) >= 2){ $q = $_GET['q']; $q = '%'.addCslashes($q, '\%_').'%'; // now we have the value ready either for escaping or binding $q = mysql_real_escape_string($q); $sql = "SELECT name, age, address FROM book WHERE name LIKE '$q'"; //or $sql = "SELECT name, age, address FROM book WHERE name LIKE ?"; $stm = $pdo->prepare($sql); $stm->execute(array($q)); $data = $stm->fetchAll(); } }
Для вывода используйте
echo htmlspecialchars($_GET['q']);
здесь не нужны полосы.
Кроме того, я слышал, что magic_quotes и charset могут каким-то образом привести к инъекциям – это правильно?
волшебные цитаты не повредят вашей безопасности, если вы их не будете использовать.
charset опасен в случае некоторых чрезвычайно редких кодировок, но только если неправильно установлен. если для этой цели были использованы mysql(i)_set_charset
или DSN (в случае PDO) – вы снова в безопасности.
Что же касается PDO, то для начала можно использовать теги wiki , я считаю,