1c-bitrix / php · 29.01.2010

Правильное удаление элементов [bitrix api]

Есть такая уязвимость, когда атакующий может удалить элемент, каталог, или даже инфоблок. Для этого нужно найти страницу или скрипт который выполняет эти действия.

После чего ему нужно всего навсего добавить картинку, например на форум, и в адрес url картинки подставить определенно сформированный адрес.

Например есть функционал вывода новостей, причем пользователь может как добавлять так и удалять новости. Ссылка на удаление новости  выглядит у нас вот так.

www.site.ru/news/detail.php?ID=777&del=Y

Теперь если мы добавим пост на форум или блоги, и добави картинку с ссылкой,

<img src=»www.site.ru/news/detail.php?ID=777&del=Y» />

то администратор будучи авторизованным благополучно удалить элемент в ID 777. Проблема думаю ясна, теперь как это предотвратить.

string bitrix_sessid() — возвращает идентификатор сессии, предварительно обработанный функцией md5.
bool check_bitrix_sessid($varname=’sessid’) — возвращает true, если верно условие $_REQUEST[$varname] == bitrix_sessid(), иначе false.
string bitrix_sessid_get($varname=’sessid’) — возвращает строку вида $varname=идентификатор сессии
string bitrix_sessid_post($varname=’sessid’) — возвращает строку вида <input type=»hidden» name=»$varname» id=»$varname» value=»идентификатор сесии» />

Передача идентификатора сессии в форме

<form method=»post» action=»/news/add.php»>
<?=bitrix_sessid_post()?>
Title: <input type=»text» name=»NAME» size=»40″ maxlength=»255″ value=»»>
</form>

Передача идентификатора в ссылке

<a href=»/news/detail.php?ID=123&del=Y&<?=bitrix_sessid_get()?>»>Удалить</a>

Проверка сессии

if($arResult[«Perm»]>=BLOG_PERMS_MODERATE && intval($_GET[«delete_comment_id»])>0 && check_bitrix_sessid())
{
/*Удаление комментария*/
}

Таким образом злоумышленник даже если сделает пакость то нечего не произойдет как ID сессии будет разный.

Решил добавить в себе в блог чтобы долго не искать в хелпе и просто не забывать делать такую проверку.

Оригинал