Какие фильтрации входящих данных вы производите?
ограничивать пользователей в том, какие символы они хотят использовать это глупость. 
Проблема sql иньекций в контексте php решается использованием pdo + prepared statements.
Проблема XSS решается эскейпингом (htmlentities). Проще взять на вооружения шаблонизаторы вроде twig-а, которые по умолчанию все выводящиеся данные эскейпят.
Вообще думаю вам стоит взять какой-нибудь популярный фреймворк (doctrine2, silex и т.д.) и не париться по поводу большей части этих проблем.
При добавлении данных в бд, для предотвращения SQL-инъекции, все данные пропускаем через mysql_real_escape_string:function sanitize($string) {
    return "'" . mysql_real_escape_string($string) . "'";
}
$query = sql_sprintf(
     "SELECT * FROM users WHERE user=%s AND mail=%s", 
     sanitize($_POST['login']), 
     sanitize($_POST['mail'])
);
Для предотвращения XSS, в артибутах используем htmlentities(), в остальных местах htmlspecialchars():<div data-attr="<?= htmlentities($var)?>"><?= htmlspecialchars($var)?></div>
Но, как уже сказал @Fesor, для работы с базой данных нужно использовать PDO или DBAL, но не функции mysql_*, которые не рекомендуется использовать (даже специальные красные предупреждающие плашки на страницах документации есть).
Для проверки загруженной картинки используй функцию getimagesize().