Разработка безопасных проектов с использованием Bitrix

advertisement
Разработка безопасных проектов с
использованием 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
Download