URL и mod_rewrite: используйте много специальных символов и защищайте данные от атак - PullRequest
2 голосов
/ 12 декабря 2010

Я работаю на сайте, где страницы содержимого обрабатываются с помощью mod_rewrite, и я пытаюсь сделать URL-адрес, управляемый с помощью mod_rewrite, защищенным от SQL injections с некоторыми ограничениями символов, поскольку пользователи могут создавать содержимое страниц, напримерthis:

http://site.com/content-type/Page-created-by-user

Мои сомнения возникают, когда они вставляют что-то вроде:

http://site.com/architect/Giovanni+Dall'Agata

Мне нужно вставить ' char, потому что я могу иметь такие имена, например, для известных архитекторовно я не знаю, смогу ли я сохранить данные в безопасности и как предотвратить SQL injections с этим символом.

Должен ли я сделать что-то конкретное для предотвращения атак?

Я использую PDO classв PHP вот так:

$architect = strip_tags (trim ($_REQUEST["architect"]));

// pdo class etc..
$pdo_stmt->bindParam (":arch", $architect, PDO::PARAM_STR);
// and the other code here...

Пользователи не могут создавать страницы с такими символами: < > / \ * ? = мне тоже запретить ' и "?Или я должен разрешить только один из ' и " символов или я могу использовать их вместе и обеспечить безопасность сервера?

Ответы [ 2 ]

2 голосов
/ 12 декабря 2010

$ stmt-> bindParam (и bindValue, и вообще подготовленные операторы) безопасны от внедрения SQL. Все серьезные структуры SB поддерживают способ добавления параметров в запрос, а значения, добавленные таким образом, очищаются. Вы всегда должны делать это и никогда не вставлять переменные данные, поступающие от пользователей (см. Комментарии) вручную, в строку запроса SQL.

Это все еще оставляет вопрос об инъекциях XSS, которые легче пропустить (хотя и менее опасны); чтобы избежать их, всегда используйте htmlspecialchars($var,ENT_QUOTES) (или urlencode, в зависимости от контекста).

0 голосов
/ 12 декабря 2010

PDO автоматически экранирует такие символы, как ', поэтому с вами все будет в порядке, просто убедитесь, что у вас отключены register_globals и magic_quotes и всегда используйте bindParam для ваших запросов.

Также, если вы говорите о создании динамических URL-адресов, у вас все равно не должно быть символа '. Я всегда использую:

$str = preg_replace("([^0-9a-zA-Z\-])", "", $str);

Что удаляет из строки все, что не 0-9, a-z или тире.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...