Можно легко обезапасить любю cms поставив грамотную фильтрацию, так что если вы не уверненны в своем движке или в чужом просто просто проводите все запросы через эту функцию. PHP: <? error_reporting(0); function HLSQL($Query) { $Query=preg_replace("/(\s{1})(JOIN)/", "\\1\nJOIN", $Query); $Query=preg_replace("/([^a-zA-Z]{1})([\d0-9]+)/", "\\1<span style=\"color:6666CC\">\\2</span>", $Query); $Query=preg_replace("/('[^']+')/", "<span style=\"color:FF9900\">\\1</span>", $Query); $Query=preg_replace("/(#.*\n)/", "<span style=\"color:999999\">\\1</span>", $Query); $Query=preg_replace("/FROM[\s+](\S+)\s/", "FROM <span style=\"color:339900;text-decoration:underline\">\\1</span> ", $Query); $Query=preg_replace("/JOIN[\s+](\S+)\s/", "JOIN <span style=\"color:339900;text-decoration:underline\">\\1</span> ", $Query); $Query=preg_replace("/(COUNT|SUM)\(([^\)]+)\)/", "<span style=\"color:FF0000;font-weight:bold\">\\1</span>(\\2)", $Query); $Query=preg_replace("/\s{1}(FROM|JOIN|GROUP|WHERE|ORDER|LIMIT|AND|ON)\s{1}/", " <span style=\"color:0000FF;font-weight:bold;\">\\1</span> ", $Query); $Query=preg_replace("/\s{1}(BY|OR|AS|IN|BETWEEN)\s{1}/", " <span style=\"color:000000;font-weight:bold;\">\\1</span> ", $Query); $Query=preg_replace("/(SELECT)/", " <span style=\"color:0000FF;font-weight:bold;\">\\1</span> ", $Query); $Query=preg_replace("/\(/", "<span style=\"font-weight:bold;\">(</span>", $Query); $Query=preg_replace("/\)/", "<span style=\"font-weight:bold;\">)</span>", $Query); return "<p style=\"color:000000; font-size:12px;\">".nl2br($Query)."</p>"; } ?>
попробовал эту библиотеку, сразу же застрял кричит ошибка Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in в этой стрке PHP: $whonline=mysql_fetch_array($user_online); до нее PHP: $online =sql_placeholder('SELECT * FROM users_reg WHERE '.time().'-`login_time` <= 60*2'); $user_online = mysql_query($online);
пробовал уже и так и этак, эффект одинаковый, но вот если отрубаю библиотеку и ставлю обычные ковычки то все работает=)) бредд
Имхо, вполне хватит фильтрации основных опасных символов чтобы противостоять иньекции. ну плюс-минус конечно PHP: <?php $query = $_POST['query']; $query = str_replace("'",'', $query); $query = str_replace('-','', $query); $query = str_replace('+','', $query); $query = str_replace('/','', $query); $query = str_replace('*','', $query); $query = str_replace(' ','',$query); $query = str_replace('%','',$query); ?> После фильтрации этих символов sql-инъекция уже и так будет невозможна....Ещё в одном учебнике по php читал что одинарную кавычку лучше не просто фильтровать а заменять на обратную ` .. не знаю насколько эт лучше и сопстна зачем)) Ну Кэш всё равно молодец, лови +
ну собственно это я кинул для описания сути placeholders сам я успользую простенькую функцию, взятую из учебника Котерова, мне пока хватает.
Если в самой переменной не заданно что данные только пост ac. фильтрацию легко можно обойти постав данные гет.
<?php $query = $GLOBALS['query']; $query = str_replace("'",'', $query); $query = str_replace('-','', $query); $query = str_replace('+','', $query); $query = str_replace('/','', $query); $query = str_replace('*','', $query); $query = str_replace(' ','',$query); $query = str_replace('%','',$query); ?>
PHP: function sql_query(){ unset($this->result); $args = func_get_args(); $tmpl =& $args[0]; $tmpl = str_replace("%", "%%", $tmpl); $tmpl = str_replace("?", "%s", $tmpl); foreach ($args as $i=>$v){ if (!$i) continue; // это шаблон if (is_int($v)) continue; // целые числа не нужно экранировать $args[$i] = "'".mysql_real_escape_string($v)."'"; } $args[count($args)] = 'UNKNOWN_PLACEHOLDER'; $query=call_user_func_array("sprintf", $args); $this->result=@mysql_query($query) or die(mysql_error()); return $this->result; } вот метод класса обёртка, приемущество в том, что нет возможности забыть провести проверку входных данных.
[ cash ]мож я туплю (только сейчас просмотрел код ) , непонял назначение т.е. каждый запрос прогоняем и смотрим визуально правильно написали или нет?(хотя подсветка мне понравилась + ) по коду, думаю надо регулярки с модификатором /i и в [\d0-9]+ помойму что то одно лишнее.
>> Можно легко обезапасить любю cms поставив грамотную фильтрацию с каких это пор функции для подсветки синтаксиса кода стали "грамотной фильтрацией" ? +)) >> просто проводите все запросы через эту функцию. ога, я бы посмотрел на такую cms.. +)
А если в каждый скрипт (или в тот, который вызывается в каждом): PHP: foreach ($_GET as $check_url) { if (!preg_match("/[a-zA-Z0-9]/",$check_url)) { die ("access forbidden"); } } unset($check_url); Это только для Get, для постов надо настроить по своему регулярное выражение...
2 Enot and Meanor, use $_REQUEST. $query = $_POST['query']; -> $query = $_REQUEST['query']; .... foreach ($_REQUEST as $check_url) .... куки, пост, гет, файл - все в одной куче PS. хотя..... я права насчет REQUEST или как?
Ну это личное дело каждого. Лично я предпочитаю какой метод использую, такой и указываю,мне так проще) Насчёт $_REQUEST при использовании POST и GET да. К кукам это совсем не относится, там HTTP_COOKIE_VARS масть держит))