|
|
|
| Добрый день, обязательно ли стоит переменные из формы(куда вводят текст) обрабатывать stripslashes? $a = stripslashes($a). Я так понимаю делают это для того, чтобы базе не навредили? Если можно, пример, со слешами \, как можно навредить базе :) | |
|
|
|
|
|
|
|
для: ladan
(14.12.2011 в 11:42)
| | Прочитайте про магические кавычки..тогда поймете... | |
|
|
|
|
|
|
|
для: ladan
(14.12.2011 в 11:42)
| | Не совсем так. При экранировании имеется два подхода, вы можете просто экранировать спец символы при поступлении их из формы (или не экранировать, если режим "магических кавычек" включен), а можете просто убирать доп-экранирование (если оно добавлено режимом "магические кавычки"), а самим экранированием заниматься поближе к SQL-запросу. Для убирания доп-экранирования как раз и используется stripslashes(). Первый подход удобен, когда у вас много данных (почти все) поступает из вне, второй - когда у вас много данных поступает из других таблиц или файлов (вам часть данных придется все-равно экранировать поблизости от SQL-запроса и следить за тем, кто поступил из вне, а кто изнутри становится накладным и небезопасным).
>Если можно, пример, со слешами \, как можно навредить базе :)
Навредить можно при помощи SQL-инъекций, у нас имеется книга "Головоломки на PHP для хакера", в которой описывается, как можно навредить и самим предлагается попробовать (разумеется для всех заданий есть ответы). Фактически при помощи единственной SQL-инъекции можно получить информацию из всех таблиц и полей базы данных. В том числе и пароли, в том числе и в других таблицах, например, обслуживающих систему администрирования. | |
|
|
|
|
|
|
|
для: cheops
(14.12.2011 в 14:38)
| | спасибо за инфу, нашел вот такое:
Все запросы, использующие внешние данные, требуется защитить от SQL-инъекций. Внешние данные могут быть переданы не только в качестве GET-параметров, но и методом POST, взяты из COOKIE, со сторонних сайтов или из базы данных, в которую пользователь имел возможность занести информацию.
Все числовые параметры следует явно преобразовывать в числовой вид с помощью функций intval() и floatval()
Все строковые параметры следует экранировать с помощью mysql_real_escape_string() и заключать в кавычки.
Если построить SQL-инъекцию сложно, не следует ожидать, что злоумышленник не догадается как это сделать. Особенно это относится к движкам, исходный код которых является публичным.
думаю хватит :)
а как можно удалять обратные слеши (\)? Вообщем ситуация такая, если человек в текстовом поле формы введет допустим Саша\, то запись в бд не происходит, а если ввести Саша\саша, то все ок. Или просто ввести обратный слеш, то тоже запись в БД не пройзойдет. Может есть какое-то условие, типа если в переменной $a существует хоть один обратный слеш, то скрипт останавливать и выводить сообщение, что обратные слеши запрещены..
mysql_error выводит следущее
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''\')' at line 1
|
| |
|
|
|
|
|
|
|
для: ladan
(14.12.2011 в 20:42)
| | Штука в том, что если пользователь вводит "Саша\", то и должно так быть в базе, т.е. нужно добиться того, чтобы в строке было "Саша\\", аналогично и "Саша\саша" должно преобразоваться в "Саша\\саша", а не в "Сашасаша" или хуже того в "Сашааша", где между a и a, стоит невидимый символ. Поэтому и нужно экранирование, а stripslashes() нужен, чтобы избежать повторого экранирования, чтобы начальное "Саша\саша" не превращалось в "Саша\\\саша", "Саша\\\\саша" и "Саша\\\\\саша". Делать можно что угодно, но в базе должно лежать ровно то, что ввел пользователь. В противном случае, мы бы сейчас с вами не могли бы разговаривать - код бы резал бы наши слеши, как ему вздумается и отображал бы лишь то, что считает безопасным. А от него требуется отображать то, что ввел пользователь. | |
|
|
|
|
|
|
|
для: cheops
(14.12.2011 в 22:50)
| | ясно спасибо :) | |
|
|
|
|
|
|
|
для: cheops
(14.12.2011 в 22:50)
| | а как можно с мощью preg_match запретить вводить обратные слеши(\)? или может другой способ есть? | |
|
|
|
|
|
|
|
для: ladan
(15.12.2011 в 11:05)
| | В регулярных выражениях, с ними тоже не просто, особенно в таких языках, как PHP, где регулярные выражения в строках со своими экранирующими слешами. Вообще следует искать символ "\\". | |
|
|
|
|
|
|
|
для: cheops
(15.12.2011 в 13:26)
| | спасибо, правда с 2 \\ не получилось, а вот 3 подрят прописал в рег. выражении и теперь все окей, обратные слеши находятся :) спасибо еще раз! | |
|
|
|