1. PHP / Говнокод #2874

    +160.2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    function createCategory(){
    	global $_POST,$_SESSION;
    	$result = mysql_query(sprintf("INSERT INTO `categories` (`id` ,`name` ,`description`)
    									VALUES (NULL , %s, %s);",
    	$this->prepare($_POST['name']), $this->prepare($_POST['description'])));
    	
    	return $result?true:false;
    }
    function prepare($data,$type = 'other'){
    		if($type == 'other'){
    		if(is_numeric($data) or is_float($data)){
    			return "'".$data."'";
    		}else if(is_string($data)){
    			return "'".mysql_real_escape_string($data)."'";
    		}
    		}else if($type == 'pswd'){
    			return "'".sha1($data.SECRET_WORD)."'";
    		}
    	}

    Насколько это защищено от sql injection?

    Запостил: DanxilLs, 26 Марта 2010

    Комментарии (17) RSS

    • Хм, а че intval'а-то нету в numeric?
      Ответить
    • Дык если там цифры и так, смысл делать intval();?
      Ответить
    • вроде все норм)
      Ответить
    • global $_POST,$_SESSION; это классно :)
      Ответить
      • Функция недоработанная... будет еще добавляться функционал именно поэтому там прописана эта инструкция)
        Ответить
        • Для любой функции не надо объявлять $_POST,$_SESSION как глобальные :)
          Ответить
          • они суперглобальные
            Ответить
            • Спасибо. Вы думаете, я не знаю как эти переменные называются?
              Ответить
              • Кэп каг-бэ намекает, что глобальные и суперглобальные переменные — вещи разные.
                Ответить
                • А теперь прочитайте строку 2 словами

                  - Объявить переменные $_POST,$_SESSION глобальными.

                  Поэтому и писал, что не надо эти переменные объявлять как глобальные
                  Ответить
    • > $this->prepare($_POST['name'])
      Откройте для себя mysqli - http://php.net/manual/en/mysqli.prepare.php
      Ответить
      • Все было бы класс конечно, но я как то разрабатывал cms с использованием PDO а когда переносил проект на паблик сервер оказалось что там нет поддержки PDO
        Ответить
        • причем тут PDO?
          Ответить
          • А при том что буду разрабатывать все под mysqli или pdo а на хосте окажется такого нету, либо отключенно
            Ответить
            • так это хостинг надо подбирать под требования проекта, а не наоборот
              Ответить
    • В конце ф-ии поставь return 'NULL'; на всякий случай... если ни один type не совпадёт
      Ответить
    • А лучше сделать ебёртку над INSERT INTO

      sql_insert(array_tempaltes, array_values) и передавай два массива ей...
      array('%s','%s') и array($_POST['name'],$_POST['description']);
      а там уже препарируй параметры и вызывай sql->query...
      и будет намного проще
      Ответить

    Добавить комментарий