Разработка безопасных проектов с использованием Bitrix Framework. Смирнов Максим Ведущий программист «1С-Битрикс» Безопасность Безопасность среды Внешний аудит безопасности 2005 Виртуальная машина и вебокружение Безопасный API 2006 2007 2008 2009 Монитор безопасности OTP 2010 2011 2012 Аудит безопасности сайтов Создание внутреннего отдела безопасности Безопасность платформы Проактивная защита Проактивный фильтр WAF Безопасность партнерских разработок Безопасность Платформа Разработки партнера Проактивная защита Хостинг и администрирование Потоки данных Проактивный фильтр SQL $DB->ForSql $DB->ForSqlLike intval 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <?php class CMyService { function deleteById($ID) { global $DB; return $DB->Query('DELETE from b_my_service WHERE ID = \''.$DB->ForSql($ID).'\''); } function deleteByName($NAME) { global $DB; return $DB->Query('DELETE from b_my_service WHERE NAME like ''.$DB->ForSqlLike($NAME).'\''); } } SQL - рекомендуем 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <?php class CMyService { function add($arFields) { global $DB; return $DB->Add("b_my_service", $arFields); } $DB->Add $DB->PrepareUpdate function update($ID, $arFields) { global $DB; $ID = intval($ID); $strUpdate = $DB->PrepareUpdate("b_my_service", $arFields); if ($strUpdate != "") { if (!$DB->Query("UPDATE b_my_service SET ".$strUpdate." WHERE ID=".$ID)) return false; } return true; } } Внимание! «~»! $DB->Add $DB->PrepareUpdate 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?php if( $_SERVER["REQUEST_METHOD"] == "POST" && check_bitrix_sessid() //CSRF protection ) { /* WRONG */ //$DB->Add("b_my_service", $_POST); /* RIGHT */ $DB->Add("b_my_service", array( "NAME" => $_POST["NAME"], "SORT" => $_POST["SORT"], )); LocalRedirect($APPLICATION->GetCurPageParam()); } HTML CUtil::JSEscape CUtil::PhpToJSObject GetMessageJS 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 htmlspecialcharsEx htmlspecialcharsbx urlencode CHTTP::urnEncode <!--JavaScript escape demo--> <script> var mess = '<?echo GetMessageJS("MESSAGE_ID")?>'; var str = '<?echo CUtil::JSEscape($str)?>'; var arResult = <?echo CUtil::PhpToJSObject($arResult)?>; </script> <!--HTML attributes values--> <label for="<?echo htmlspecialcharsbx($id)?>" onclick="<?echo htmlspecialcharsbx("alert(\"".CUtil::JSEscape($message)."\")");?>"> <!--HTML between tags--> <?echo htmlspecialcharsEx($preview);?> </label> <!--HTML inside textarea demo--> <textarea id="<?echo htmlspecialcharsbx($id)?>"><?echo htmlspecialcharsbx($text);?></textarea> <!--HTML "a" tag, href attribute--> <a href="<?echo htmlspecialcharsbx( CHTTP::urnEncode($page)."?".urlencode($parameter)."=".urlencode($value) ); ?>"></a> Файлы - CBXVirtualIo $io->CombinePath $io->ValidatePathString 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <?php $io = CBXVirtualIo::GetInstance(); if( $_SERVER["REQUEST_METHOD"] == "POST" && check_bitrix_sessid() //CSRF protection && $_REQUEST["action"] === "import" ) { $pathWithinRoot = $_SERVER["DOCUMENT_ROOT"].$io->CombinePath("/", $_POST["path"]); if ($io->ValidatePathString($pathWithinRoot) && $io->FileExists($pathWithinRoot)) { $h = $io->OpenFile($pathWithinRoot, "rb"); if (is_resource($h)) { //TODO: import here } } LocalRedirect($APPLICATION->GetCurPageParam()); } Файлы - CTempFile CTempFile::GetFileName CTempFile::GetDirectoryName автоматическое удаление можно задать время хранения 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <?php $io = CBXVirtualIo::GetInstance(); if( $_SERVER["REQUEST_METHOD"] == "POST" && check_bitrix_sessid() //CSRF protection && $_REQUEST["action"] === "export" ) { $tempFilePath = CTempFile::GetFileName("export.csv"); CheckDirPath($tempFilePath); $h = $io->OpenFile($tempFilePath, "w"); if (is_resource($h)) { //TODO: export here CFile::ViewByUser(CFile::MakeFileArray($tempFilePath)); } LocalRedirect($APPLICATION->GetCurPageParam()); } Спасибо за внимание! Вопросы? Twitter: @qMBQx8GH Skype: mv.smirnov E-mail: max@bitrix.ru