Возвращаясь к sql-иньекциям
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Возвращаясь к sql-иньекциям - 2006-05-21 18:27:56
|
|
|
SaBo
Сообщений: 1089
Оценки: 0
Присоединился: 2005-02-17 20:16:54
|
Люди, подскажите код, как вы фильтруете переменные перед внесением в БД MySQL и при выводе на экран из базы.
буду очень благодарен.
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-21 18:35:43
|
|
|
.:[ksuri]:.
Сообщений: 216
Оценки: 0
Присоединился: 2005-04-17 23:52:52
|
Чтонить вроде этого <BR><?php<BR><BR><BR>if (isset($_GET))<BR> {<BR><BR>$cp = "\\" . "\\";<BR>$trans = array('\"' => "",<BR> "\'" => "",<BR> "{" => "",<BR> "}" => "",<BR> ";" => "",<BR> "#" => "",<BR> '/' => "",<BR> "%2527" => "",<BR> "%27" => "",<BR> "$" => "",<BR> "." => "",<BR> "$cp" => "",<BR> "http" => "",<BR> "ftp" => "",<BR> "www" => "",<BR> "://" => "",<BR> "pass" => "",<BR> "pwd" => "",<BR> "from" => "",<BR> "select" => "",<BR> "drop" => "",<BR> "where" => "",<BR> "order" => "",<BR> "alter" => "",<BR> "from" => "",<BR> "update" => "",<BR> "FROM" => "",<BR> "SELECT" => "",<BR> "DROP" => "",<BR> "WHERE" => "",<BR> "ORDER" => "",<BR> "ALTER" => "",<BR> "FROM" => "",<BR> "UPDATE" => ""<BR> );<BR><BR><BR>while ($foo = current($_GET))<BR> {<BR> $_GET[key($_GET)] = strtr($_GET[key($_GET)], $trans);<BR> next($_GET);<BR> }<BR><BR> }<BR><BR>?><BR>
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-21 18:39:29
|
|
|
SaBo
Сообщений: 1089
Оценки: 0
Присоединился: 2005-02-17 20:16:54
|
А это не тоже, что и str_replace[sm=12.gif]
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-21 18:49:46
|
|
|
SaBo
Сообщений: 1089
Оценки: 0
Присоединился: 2005-02-17 20:16:54
|
Пасибо, понял. Не тоже.
А ещё у кого какие варианты есть?
З.Ы. а такая обработка не сказывается на роботоспособность сайта?
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-21 18:55:31
|
|
|
SaBo
Сообщений: 1089
Оценки: 0
Присоединился: 2005-02-17 20:16:54
|
И ещё вопрос: не будет ли опасно исключить из этого списка символы: $ . ;?
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-21 19:29:06
|
|
|
SaBo
Сообщений: 1089
Оценки: 0
Присоединился: 2005-02-17 20:16:54
|
И ещё вопрос: Как сделать так, что бы если потенциально опасный код был введён, выводилась надпись об этом.
Я пробовал так:
<?php<BR>echo("<form action=\"test.php\" method=\"post\"><input type=\"text\" name=\"f1\"><input type=\"text\" name=\"f2\"><input type=\"submit\"></form>");<BR><BR>if (isset($_POST))<BR> {<BR><BR>$cp = "\\" . "\\";<BR>$trans = array('\"' => "[dan]",<BR> "\'" => "[dan]",<BR> "{" => "[dan]",<BR> "}" => "[dan]",<BR> ";" => "[dan]",<BR> "#" => "[dan]",<BR> '/' => "[dan]",<BR> "%2527" => "[dan]",<BR> "%27" => "[dan]",<BR> "$" => "[dan]",<BR> "." => "[dan]",<BR> "$cp" => "[dan]",<BR> "http" => "[dan]",<BR> "ftp" => "[dan]",<BR> "www" => "[dan]",<BR> "://" => "[dan]",<BR> "pass" => "[dan]",<BR> "pwd" => "[dan]",<BR> "from" => "[dan]",<BR> "select" => "[dan]",<BR> "drop" => "[dan]",<BR> "where" => "[dan]",<BR> "order" => "[dan]",<BR> "alter" => "[dan]",<BR> "from" => "[dan]",<BR> "update" => "[dan]",<BR> "FROM" => "[dan]",<BR> "SELECT" => "[dan]",<BR> "DROP" => "[dan]",<BR> "WHERE" => "[dan]",<BR> "ORDER" => "[dan]",<BR> "ALTER" => "[dan]",<BR> "FROM" => "[dan]",<BR> "UPDATE" => "[dan]"<BR> );<BR><BR>$ups=0;<BR>while ($foo = current($_POST))<BR> {<BR> $_POST[key($_POST)] = strtr($_POST[key($_POST)], $trans);<BR> next($_POST);<BR> }<BR><BR> }<BR><BR><BR>$f1="[dan]";<BR>$f2=@$_POST['f1'];<BR>$pos = strpos($f2, $f1);<BR><BR>if($pos == false)<BR>{<BR>echo("<br><b>В запросе f1 не было опасных кодов.</b><br>");<BR>}<BR>else<BR>{<BR>echo("<br><b>В запросе f1 был потенциально опасный код</b><br>");<BR>}<BR><BR>$f2=@$_POST['f2'];<BR>$pos = strpos($f2, $f1);<BR><BR>if($pos == false)<BR>{<BR>echo("<br><b>В запросе f2 не было опасных кодов.</b><br>");<BR>}<BR>else<BR>{<BR>echo("<br><b>В запросе f2 был потенциально опасный код</b><br>");<BR>}<BR><BR>$g1=@$_POST['f1'];<BR>$g2=@$_POST['f2'];<BR>echo("$g1 $g2");<BR>?><BR>
Но чё-то не пашет[sm=5.gif]
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-21 19:57:16
|
|
|
.:[ksuri]:.
Сообщений: 216
Оценки: 0
Присоединился: 2005-04-17 23:52:52
|
quote:
—————-<BR>Цитата: Дата:21.05.2006 18:49:46, Автор:QuickShare :: Пасибо, понял. Не тоже.<BR><BR><BR>А ещё у кого какие варианты есть?<BR><BR><BR>З.Ы. а такая обработка не сказывается на роботоспособность сайта? —————-
Да нет, не сказывается…
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-21 19:58:44
|
|
|
.:[ksuri]:.
Сообщений: 216
Оценки: 0
Присоединился: 2005-04-17 23:52:52
|
. ; $ - нет.
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-21 20:01:20
|
|
|
.:[ksuri]:.
Сообщений: 216
Оценки: 0
Присоединился: 2005-04-17 23:52:52
|
quote:
—————-<BR>Цитата: Дата:21.05.2006 19:29:06, Автор:QuickShare :: И ещё вопрос: Как сделать так, что бы если потенциально опасный код был введён, выводилась надпись об этом.<BR><BR><BR>Я пробовал так:<BR><BR><BR>&amp;lt;?php<BR><BR>echo(&amp;quot;&amp;lt;form action=&amp;quot;test.php&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;f1&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;f2&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;submit&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&amp;quot;);<BR><BR><BR>if (isset($_POST))<BR><BR> {<BR><BR><BR>$cp = &amp;quot;\&amp;quot; . &amp;quot;\&amp;quot;;<BR><BR>$trans = array('&amp;quot;' =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;'&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;{&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;}&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;;&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;#&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> '/' =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;%2527&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;%27&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;$&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;.&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;$cp&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;http&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;ftp&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;www&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;://&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;pass&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;pwd&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;from&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;select&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;drop&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;where&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;order&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;alter&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;from&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;update&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;FROM&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;SELECT&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;DROP&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;WHERE&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;ORDER&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;ALTER&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;FROM&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;,<BR><BR> &amp;quot;UPDATE&amp;quot; =&amp;gt; &amp;quot;[dan]&amp;quot;<BR><BR> );<BR><BR><BR>$ups=0;<BR><BR>while ($foo = current($_POST))<BR><BR> {<BR><BR> $_POST[key($_POST)] = strtr($_POST[key($_POST)], $trans);<BR><BR> next($_POST);<BR><BR> }<BR><BR><BR> }<BR><BR><BR><BR>$f1=&amp;quot;[dan]&amp;quot;;<BR><BR>$f2=@$_POST['f1'];<BR><BR>$pos = strpos($f2, $f1);<BR><BR><BR>if($pos == false)<BR><BR>{<BR><BR>echo(&amp;quot;&amp;lt;br&amp;gt;&amp;lt;b&amp;gt;В запросе f1 не было опасных кодов.&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&amp;quot;);<BR><BR>}<BR><BR>else<BR><BR>{<BR><BR>echo(&amp;quot;&amp;lt;br&amp;gt;&amp;lt;b&amp;gt;В запросе f1 был потенциально опасный код&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&amp;quot;);<BR><BR>}<BR><BR><BR>$f2=@$_POST['f2'];<BR><BR>$pos = strpos($f2, $f1);<BR><BR><BR>if($pos == false)<BR><BR>{<BR><BR>echo(&amp;quot;&amp;lt;br&amp;gt;&amp;lt;b&amp;gt;В запросе f2 не было опасных кодов.&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&amp;quot;);<BR><BR>}<BR><BR>else<BR><BR>{<BR><BR>echo(&amp;quot;&amp;lt;br&amp;gt;&amp;lt;b&amp;gt;В запросе f2 был потенциально опасный код&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&amp;quot;);<BR><BR>}<BR><BR><BR>$g1=@$_POST['f1'];<BR><BR>$g2=@$_POST['f2'];<BR><BR>echo(&amp;quot;$g1 $g2&amp;quot;);<BR><BR>?&amp;gt;<BR><BR><BR><BR><BR>Но чё-то не пашет[sm=5.gif] —————-
Попробуй вместо strpos() юзать preg_match() или eregi().
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-21 20:09:38
|
|
|
Lex_Voodoo
Сообщений: 7328
Оценки: 0
Присоединился: 2004-12-07 13:55:12
|
quote:
—————-<BR>Цитата: Дата:21.05.2006 18:35:43, Автор:.:[ksuri]:. :: Чтонить вроде этого<BR><BR><BR><BR>&amp;lt;?php<BR><BR><BR><BR>if (isset($_GET))<BR><BR> {<BR><BR><BR>$cp = &amp;quot;\&amp;quot; . &amp;quot;\&amp;quot;;<BR><BR>$trans = array('&amp;quot;' =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;'&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;{&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;}&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;;&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;#&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> '/' =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;%2527&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;%27&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;$&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;.&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;$cp&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;http&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;ftp&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;www&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;://&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;pass&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;pwd&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;from&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;select&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;drop&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;where&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;order&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;alter&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;from&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;update&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;FROM&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;SELECT&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;DROP&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;WHERE&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;ORDER&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;ALTER&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;FROM&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,<BR><BR> &amp;quot;UPDATE&amp;quot; =&amp;gt; &amp;quot;&amp;quot;<BR><BR> );<BR><BR><BR><BR>while ($foo = current($_GET))<BR><BR> {<BR><BR> $_GET[key($_GET)] = strtr($_GET[key($_GET)], $trans);<BR><BR> next($_GET);<BR><BR> }<BR><BR><BR> }<BR><BR><BR>?&amp;gt;<BR><BR> —————-
Пипец маразм………. А если я напишу sElEct? Твой код благополучно отправится коту под хвост? И что, $_GET мы фильтруем, а $_POST уже не надо? А если в POST будет текст, в котором ничего не подозревающий юзер напишет "Hello I'm recently coming from Brasilia where too many wild monkeys"?? Я уж не говорю, какие проблемы это привнесёт при необходимости возврата данных веб-форм. В общем, ИМХО, автор это только что сам придумал, и на практике (надеюсь) ни разу не использовал.
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-21 20:59:03
|
|
|
SaBo
Сообщений: 1089
Оценки: 0
Присоединился: 2005-02-17 20:16:54
|
Lex, а ты чего посоветуешь?
Я искал во всяких статьях, но везде написано что-нибудь типа: "про то, как защититься от sql-инъекций статей написано немало. А вот мы поговорим о том, как дро**** правильно используя БД" и от статьи только одно название осталось…
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-21 21:18:16
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
quote:
—————-<BR>Цитата: Дата:21.05.2006 20:59:03, Автор:QuickShare :: Lex, а ты чего посоветуешь?<BR><BR>Я искал во всяких статьях, но везде написано что-нибудь типа: &amp;quot;про то, как защититься от sql-инъекций статей написано немало. А вот мы поговорим о том, как дро**** правильно используя БД&amp;quot; и от статьи только одно название осталось… —————-
написать свой PHP в котором будут ключевые слова `select', `insert`, `update`, `where`, `union`… короче, чтобы синтаксис sql был бы подмножеством этого языка. Ну и ещё, неплохо было бы добавить в этот язык синтаксис a la html, чтобы интерпретатор/компилятор, мог бы знать что надо esc'апить, а что нет. [sm=2.gif]
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-21 21:28:06
|
|
|
Сhaos_Сode
Сообщений: 1049
Оценки: 0
Присоединился: 2006-01-12 11:54:12
|
А не достаточно ли просто грамотно составлять запросы типа
$query = "select user, passhash from users where id = '$id'";
т.е заключать в кавычки а сам код выглядит так
$id = str_replace('(', ', $id); $id = addslashes($id); // или $id = htmlspecialchars($id, ENT_QUOTES);
$result = mysql_query($query); if(!$result) { header('1осаtiоn: index.php') || die('incorrect query'); }
Я думаю, что этого вполне хватит или я не прав?
Можно ввести дополнительные проверки типа
if(!is_numeric($id)) die('Incorrect value');
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-21 21:34:54
|
|
|
Сhaos_Сode
Сообщений: 1049
Оценки: 0
Присоединился: 2006-01-12 11:54:12
|
quote:
—————-<BR>Цитата: Дата:21.05.2006 21:18:16, Автор:rgo ::
quote:
—————-<BR><BR>Цитата: Дата:21.05.2006 20:59:03, Автор:QuickShare :: Lex, а ты чего посоветуешь?<BR><BR><BR>Я искал во всяких статьях, но везде написано что-нибудь типа: &amp;amp;amp;quot;про то, как защититься от sql-инъекций статей написано немало. А вот мы поговорим о том, как дро**** правильно используя БД&amp;amp;amp;quot; и от статьи только одно название осталось… —————- <BR><BR>написать свой PHP в котором будут ключевые слова `select', `insert`, `update`, `where`, `union`… короче, чтобы синтаксис sql был бы подмножеством этого языка. Ну и ещё, неплохо было бы добавить в этот язык синтаксис a la html, чтобы интерпретатор/компилятор, мог бы знать что надо esc'апить, а что нет.<BR><BR>[sm=2.gif] —————-
Тоже маразм
Ну если на то пошло, то хватит исключения union, = и круглых скобок
остальные символы уберет htmlspecialchars( или addslashes) плюс грамотные запросы
Чуть не забыл про '%' =)
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-21 21:51:22
|
|
|
.:[ksuri]:.
Сообщений: 216
Оценки: 0
Присоединился: 2005-04-17 23:52:52
|
quote:
—————-<BR>Цитата: Дата:21.05.2006 20:09:38, Автор:Lex_Voodoo ::
quote:
—————-<BR><BR>Цитата: Дата:21.05.2006 18:35:43, Автор:.:[ksuri]:. :: Чтонить вроде этого<BR><BR><BR><BR><BR><BR>&amp;amp;amp;lt;?php<BR><BR><BR><BR><BR>if (isset($_GET))<BR><BR><BR> {<BR><BR><BR><BR>$cp = &amp;amp;amp;quot;&amp;amp;amp;quot; . &amp;amp;amp;quot;&amp;amp;amp;quot;;<BR><BR><BR>$trans = array('&amp;amp;amp;quot;' =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;'&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;{&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;}&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;;&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;#&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> '/' =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;%2527&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;%27&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;$&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;.&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;$cp&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;http&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;ftp&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;www&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;://&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;pass&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;pwd&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;from&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;select&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;drop&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;where&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;order&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;alter&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;from&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;update&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;FROM&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;SELECT&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;DROP&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;WHERE&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;ORDER&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;ALTER&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;FROM&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;,<BR><BR><BR> &amp;amp;amp;quot;UPDATE&amp;amp;amp;quot; =&amp;amp;amp;gt; &amp;amp;amp;quot;&amp;amp;amp;quot;<BR><BR><BR> );<BR><BR><BR><BR><BR>while ($foo = current($_GET))<BR><BR><BR> {<BR><BR><BR> $_GET[key($_GET)] = strtr($_GET[key($_GET)], $trans);<BR><BR><BR> next($_GET);<BR><BR><BR> }<BR><BR><BR><BR> }<BR><BR><BR><BR>?&amp;amp;amp;gt;<BR><BR><BR> —————- <BR><BR>Пипец маразм……….<BR><BR>А если я напишу sElEct? Твой код благополучно отправится коту под хвост?<BR><BR>И что, $_GET мы фильтруем, а $_POST уже не надо?<BR><BR>А если в POST будет текст, в котором ничего не подозревающий юзер напишет &amp;quot;Hello I'm recently coming from Brasilia where too many wild monkeys&amp;quot;??<BR><BR>Я уж не говорю, какие проблемы это привнесёт при необходимости возврата данных веб-форм. В общем, ИМХО, автор это только что сам придумал, и на практике (надеюсь) ни разу не использовал. —————-
Это кусок исходника сайта www.nashi.su [sm=9.gif] А ваще это вариант - переменные можно какие угодно оттуда убрать и добавить…
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-21 22:01:55
|
|
|
Lex_Voodoo
Сообщений: 7328
Оценки: 0
Присоединился: 2004-12-07 13:55:12
|
quote:
—————-<BR>Цитата: Дата:21.05.2006 20:59:03, Автор:QuickShare :: Lex, а ты чего посоветуешь?<BR><BR><BR>Я искал во всяких статьях, но везде написано что-нибудь типа: &amp;quot;про то, как защититься от sql-инъекций статей написано немало. А вот мы поговорим о том, как дро**** правильно используя БД&amp;quot; и от статьи только одно название осталось… —————-
Потому что действительно написано немало. Только на этом форуме я раза три расписывал. 1) по возможности не использовать динамический контент на основе данных пользователя. Т.е. заменять по возможности $month = $_GET['month'] на switch($_GET['month']){…}
2) Следить за типами данных. Например, элементарнейшая конструкция: $id = (int)$_GET['id']. В случае, когда $_GET['id'] будет равно 7' в $id останется 7.
3) Квотить ВСЕ приходящие данные ВО ВСЕХ запросах: $sql = "SELECT * FROM t WHERE id = " . mysql_real_escape_string($id);
В принципе, 1) и 3) достаточно.
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-21 22:29:16
|
|
|
SaBo
Сообщений: 1089
Оценки: 0
Присоединился: 2005-02-17 20:16:54
|
Лекс, умоляю, по-подробнее 1 и 3! —- Чем отличается $month = $_GET['month'] от switch($_GET['month']){…}и что должно стоять в фигурных скобках? что делает функция switch и как потом с нейю дальше работать? если в $month = $_GET['month'] мне надо, например, сделать так: echo($month); для вывода на экран, то как это сделать после обработки ф-ией switch? — $sql = "SELECT * FROM t WHERE id = " . mysql_real_escape_string($id); что делает mysql_real_escape_string();? и почему строка $sql = "SELECT * FROM t WHERE id = " . не до конца дописана?
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-21 22:57:33
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
quote:
—————-<BR>Цитата: Дата:21.05.2006 21:34:54, Автор:#chaos_coder# ::
quote:
—————-<BR><BR>Цитата: Дата:21.05.2006 21:18:16, Автор:rgo :: <BR>написать свой PHP в котором будут ключевые слова `select', `insert`, `update`, `where`, `union`… короче, чтобы синтаксис sql был бы подмножеством этого языка. Ну и ещё, неплохо было бы добавить в этот язык синтаксис a la html, чтобы интерпретатор/компилятор, мог бы знать что надо esc'апить, а что нет.<BR>[sm=2.gif] —————- <BR><BR>Тоже маразм<BR> —————-
почему же? например, как это могло бы выглядеть:
sqlclass my_record { unsigned int(32) id as primary key; string(25) name; string(35) password; string(255) email; }; /* и пускай интерпретатор вникает в то как, на каком sql движке, лучше определить таблицу */
sql::connect (<всякие опции>);
my_record::create_table ("my_table"); my_record new_rec;
new_rec.name = "имя"; new_rec.password = "пароль"; new_rec.email = "мыло@сервер.зона"; new_rec.table_name = "my_table";
sql::with_transaction { int id = 1 + sql::select sql::max (my_record::id) sql::from "my_table" sql::update_table(new_rec);
new_rec = sql::select my_record sql::from "my_table" where name = "имя"; new_rec.email = "новое@мыло.где-то"; sql::update_table (new_rec);
а если вспомнить про хтмл, то, вот ещё пример, с тем же классом:
using namespace sql; my_record records = select my_record from "my table" where my_record::id > 10; :html { :head { :meta (:http-equiv "Content-Type", :content "text/html; charset=koi8-r"); :title {"Тестовая страничка"} } :body { :table { :tr { :td {"id"} :td {"name"} :td {"email"} } foreach rec in records { :tr { :td {rec.id} :td {rec.name} :td {rec.email} } } } } }
и всё экранирование спец символов может производиться интерпретатором.
да проблемы будут: всякие жабаскрипты например, хотелось бы вставлять в html напрямую, и тупое экранирование тегов там, может неправильно сказаться. Но, тем не менее, 90% случаев можно свалить на интерпретатор, а в остальные 10% решаются за счёт, чего-нибудь в стиле inline-html. напр:
:inline-html { <тег No="1">контент</тег> <тег No="2">контент</тег> }
может и не самая удачная идея — тут я спорить не буду, но ведь не маразм? вполне себе идейка, вместо того чтобы приспосабливать C++ к генерации дин.контента, создавая пхп, создать язык-помесь SQL+HTML изначально ориентированный на генерацию html'я на основе данных из sql. избавляя тем самым программера от кучи вызовов htmlspecialchars, preg_replace и пр.
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-22 00:00:15
|
|
|
cybermind
Сообщений: 805
Оценки: 0
Присоединился: 2004-05-24 20:16:13
|
что делает mysql_real_escape_string();?
Читать: http://www.php.net/mysql_real_escape_string
Там же есть гениальная функция:
function quote_smart($value)<BR>{<BR> // Stripslashes<BR> if (get_magic_quotes_gpc()) {<BR> $value = stripslashes($value);<BR> }<BR> // Quote if not a number or a numeric string<BR> if (!is_numeric($value)) {<BR> $value = "'" . mysql_real_escape_string($value) . "'";<BR> }<BR> return $value;<BR>}
Я выношу её в отдельный модуль, который подключаю в каждую свою программу. А запрос твой будет выглядеть так: $sql = "SELECT * FROM t WHERE id = " . quote_smart($id);
почему строка $sql = "SELECT * FROM t WHERE id = " . не до конца дописана? [sm=9.gif] туда дописывается результат функции: то есть профильтрованный id.
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-22 00:06:02
|
|
|
cybermind
Сообщений: 805
Оценки: 0
Присоединился: 2004-05-24 20:16:13
|
quote:
—————-<BR>что делает функция switch и как потом с нейю дальше работать?<BR><BR>если в $month = $_GET['month'] мне надо, например, сделать так: echo($month); для вывода на экран, то как это сделать после обработки ф-ией switch?<BR>
switch - это не функция, а конструкция языка. switch ($_GET['month']) { case 'январь': case 'февраль': case 'март': case 'апрель': case 'май': case 'июнь': case 'июль': case 'август': case 'сентябрь': case 'октябрь': case 'ноябрь': case 'декабрь': echo $_GET['month']; break; case default: echo 'bad month'; } Соответственно, поможет она только в том случае, если есть возможность рассмотреть все варианты переданной переменной. Иначе остаётся только фильтровать функцией, о которой было рассказано выше.
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-22 00:07:57
|
|
|
cybermind
Сообщений: 805
Оценки: 0
Присоединился: 2004-05-24 20:16:13
|
quote:
—————-<BR>Это кусок исходника сайта www.nashi.su
да ладно?
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-22 12:48:27
|
|
|
SaBo
Сообщений: 1089
Оценки: 0
Присоединился: 2005-02-17 20:16:54
|
Так, с 3 пунктом разобрались - спасибо Lex'у и cybermind'y
А со switch'ем можно ещё раз для тупых?
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-22 13:19:49
|
|
|
AL
Сообщений: 515
Оценки: 0
Присоединился: 2004-07-19 03:19:44
|
вот
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-22 14:05:48
|
|
|
.:[ksuri]:.
Сообщений: 216
Оценки: 0
Присоединился: 2005-04-17 23:52:52
|
quote:
—————-<BR>Цитата: Дата:22.05.2006 0:07:57, Автор:cybermind ::
quote:
—————-<BR><BR>&amp;#1069;то кусок исходника сайта www.nashi.su <BR><BR><BR>да ладно? —————-
Да правда [sm=2.gif]
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-22 17:30:37
|
|
|
cybermind
Сообщений: 805
Оценки: 0
Присоединился: 2004-05-24 20:16:13
|
quote:
—————-<BR>Цитата: Дата:22.05.2006 14:05:48, Автор:.:[ksuri]:. ::
quote:
—————-<BR><BR>Цитата: Дата:22.05.2006 0:07:57, Автор:cybermind ::
quote:
—————-<BR><BR><BR>&amp;amp;amp;#1069;то кусок исходника сайта www.nashi.su <BR><BR><BR><BR>да ладно? —————- <BR><BR>Да правда [sm=2.gif] —————-
А откуда у тебя этот код? Может ещё что-нибудь интересного? Надо будет покопаться там на днях =)
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-22 18:24:36
|
|
|
.:[ksuri]:.
Сообщений: 216
Оценки: 0
Присоединился: 2005-04-17 23:52:52
|
А все-то тебе расскажи, какой любопытный [sm=nonodyad.gif] Я не хочу чтобы этот сайт ломали… [sm=16.gif]
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-22 20:59:42
|
|
|
Lex_Voodoo
Сообщений: 7328
Оценки: 0
Присоединился: 2004-12-07 13:55:12
|
quote:
—————-<BR>Цитата: Дата:22.05.2006 12:48:27, Автор:QuickShare :: Так, с 3 пунктом разобрались - спасибо Lex'у и cybermind'y<BR><BR><BR>А со switch'ем можно ещё раз для тупых? —————-
Смысл в том, что если месяцев всего 12, нет смысла передавать id месяца через GET. Можно передавать …ru/index.php?month=january
Тогда в коде: switch(month) { case "january": $month = 1; break;
case "february": $month = 2; break; ……………… default: $month = date("n"); break; }
Конкретно этот пример, конечно же, искусственный. Но есть случаи, когда это бывает действительно полезно.
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-22 22:35:56
|
|
|
SaBo
Сообщений: 1089
Оценки: 0
Присоединился: 2005-02-17 20:16:54
|
А почему тогда не сделать так:
if(@$_GET['month']=='january'){<BR>$month = 1<BR>}
???
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-23 18:27:53
|
|
|
cybermind
Сообщений: 805
Оценки: 0
Присоединился: 2004-05-24 20:16:13
|
quote:
—————-<BR>Цитата: Дата:22.05.2006 22:35:56, Автор:QuickShare :: А почему тогда не сделать так:<BR><BR><BR>if(@$_GET['month']=='january'){<BR><BR>$month = 1<BR><BR>}<BR><BR><BR>??? —————-
Потому что! Ты что, собираешься 12 условий писать?
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-23 19:45:13
|
|
|
MrBlack
Сообщений: 268
Оценки: 0
Присоединился: 2004-05-24 00:02:27
|
Для строковых параметров достаточно запрещать кавычки, причем, только тот вид кавычек, который используется в запросах, а для чисел - разрешать только цифры и точки.
А чтобы фильтрация совсем никак не сказалась на работоспособности сайта, т. е. разрешала использовать в строковых параметрах даже кавычки, надо не фильтровать, а обрабатывать строки одной из функций mysql_escape, mysql_real_escape, addslashes или quotemeta, а числа - intval.
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-23 19:48:22
|
|
|
MrBlack
Сообщений: 268
Оценки: 0
Присоединился: 2004-05-24 00:02:27
|
Вообще жаль, что в MySql нет такой фишки, как параметризованные запросы. Это бы разом решило все проблемы с инъекциями. Вот в Sqlite и то есть параметризованные запросы, а в MySql почему-то до сих пор нет.
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-24 17:41:07
|
|
|
SaBo
Сообщений: 1089
Оценки: 0
Присоединился: 2005-02-17 20:16:54
|
А как в переменной оставить только числа?
Или если пользователь введёт текст или текст+числа выдавалась бы ошибка.
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-25 15:44:46
|
|
|
SaBo
Сообщений: 1089
Оценки: 0
Присоединился: 2005-02-17 20:16:54
|
Так. Мне надо сделать так:
function quote_smart($id)<BR>{<BR> // Stripslashes<BR> if (get_magic_quotes_gpc()) {<BR> $id = stripslashes($id);<BR> }<BR> // Quote if not a number or a numeric string<BR> if (!is_numeric($id)) {<BR> $id = "'" . mysql_real_escape_string($id) . "'";<BR> }<BR> return $id;<BR>}<BR>
А за тем составить запрос: $sql = "SELECT * FROM t WHERE id = '$id'"; Или всёравно надо писать $sql = "SELECT * FROM t WHERE id = " . quote_smart($id);
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-25 16:28:37
|
|
|
MrBlack
Сообщений: 268
Оценки: 0
Присоединился: 2004-05-24 00:02:27
|
Ничто не мешает рассматривать все параметры как строки. МуСкул умеет преобразовывать типы. И пусть он сам проверяет, число там или нет. Только это замедлит работу МуСкула
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-25 16:43:17
|
|
|
SaBo
Сообщений: 1089
Оценки: 0
Присоединился: 2005-02-17 20:16:54
|
Я так и не понял, этого:
$id=@$_GET['id'];<BR>$query=mysql_query("SELECT * FROM news WHERE id=".mysql_real_escape_string($id));<BR>$t=mysql_fetch_row($query);
достатачно, что бы квотить все данные или нет?
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-25 16:52:17
|
|
|
MrBlack
Сообщений: 268
Оценки: 0
Присоединился: 2004-05-24 00:02:27
|
В кавычки их еще поставить надо. Тоесть так:
$query=mysql_query("SELECT * FROM news WHERE id='".mysql_real_escape_string($id)."';");
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-25 17:03:12
|
|
|
SaBo
Сообщений: 1089
Оценки: 0
Присоединился: 2005-02-17 20:16:54
|
пасибо.
а как можно проверить работоспособность этого всего?
Запрос какой специальный сделать?
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-25 17:16:40
|
|
|
MrBlack
Сообщений: 268
Оценки: 0
Присоединился: 2004-05-24 00:02:27
|
Как проверить прогу на безопасность - это вечный вопрос. Иначе бы давно уже никто не выпускал бы софт с багами.
В данном случае важно, как обрабатываются параметры, содержащие: 1) кавычки обоих видов (") и (') 2) слэши 3) нулевые байты 4) ключевые слова SQL
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-25 17:38:48
|
|
|
SaBo
Сообщений: 1089
Оценки: 0
Присоединился: 2005-02-17 20:16:54
|
Вот есть страничка. Я вписывал туда разные кавычки, всё, вроде, работает…
Если не впадло, можешь посмотреть?[sm=12.gif]
|
|
|
Возвращаясь к sql-иньекциям - 2006-05-27 20:22:27
|
|
|
MrBlack
Сообщений: 268
Оценки: 0
Присоединился: 2004-05-24 00:02:27
|
Что тут смотреть-то? На первый взгляд, инъекций нет. Но не забывай, что на свете существует масса других типов уязвимостей.
|
|
|
|
|