Я использую платформу CheckMarx для проверки безопасности своего сайта (для проверки контактной формы), но, к сожалению, она говорит мне о рисках, связанных с инъекцией заголовка,
Я уже применил некоторые проверки для этого, но это все еще говорит мне о риске
В чем именно может быть проблема?
Я надеюсь, вы понимаете вопрос,
Большое спасибо за рекомендации!
Вот мой PHP-код:
/* Preventing header injection */
function cleaninjections($test) {
// Remove injected headers
$find = array("/bcc\:/i",
"/Content\-Type\:/i",
"/Mime\-Version\:/i",
"/cc\:/i",
"/from\:/i",
"/to\:/i",
"/Content\-Transfer\-Encoding\:/i");
$ret = preg_replace($find, "", $test);
return $ret;
}
// Specify which fields to require from form
$required_fields = array('name','email','phone', 'additional_info', 'company_type');
$errors = array();
$message = "";
foreach($_POST as $key => $value){
$_POST[$key] = trim($value);
$_POST[$key] = cleaninjections($value);
}
// Check required fields and return error if blank
foreach($required_fields as $value){
if(!isset($_POST[$value]) || empty($_POST[$value])){
$errors[] = "אנא מלא את כל השדות"; // message about empty fields "אנא מלא את כל השדות"}
}
// Validate name field. Accepts a-z, space, period for Dr., and ' for O'Malley
if(isset($_POST['name']) && !empty($_POST['name'])){
if(!preg_match("/^[a-z '.]+$/i",stripslashes($_POST['name']))){
$errors[] = "שם לא חוקי"; // message about invalid name 'שם לא חוקי'
}
}
// Validate email field
if(isset($_POST['email']) && !empty($_POST['email'])){
if(!preg_match("/^[a-z0-9_.-]+@[a-z0-9.-]+.[a-z]{2,6}$/i",stripslashes($_POST['email']))){
$errors[] = "כתובת דואר אלקטרוני אינה תקינה"; /* 'כתובת דואר אלקטרוני אינה תקינה' */ /* message about incorrect email */
}
}
// Display any errors and exit if errors exist.
if (count($errors)) {
$errors = array_unique($errors);
foreach ($errors as $value) {
print "<li> $value</li>";
}
exit;
}
/* Preventing header injection */
Также пример сообщения об ошибке (одно из них) в порядке CheckMarx:
Также вы можете проверить весь код PHP:
<?php
/* Preventing header injection */
function cleaninjections($test) {
// Remove injected headers
$find = array("/bcc\:/i",
"/Content\-Type\:/i",
"/Mime\-Version\:/i",
"/cc\:/i",
"/from\:/i",
"/to\:/i",
"/Content\-Transfer\-Encoding\:/i");
$ret = preg_replace($find, "", $test);
return $ret;
}
// Specify which fields to require from form
$required_fields = array('name','email','phone', 'additional_info', 'company_type');
$errors = array();
$message = "";
foreach($_POST as $key => $value){
$_POST[$key] = trim($value);
$_POST[$key] = cleaninjections($value);
}
// Check required fields and return error if blank
foreach($required_fields as $value){
if(!isset($_POST[$value]) || empty($_POST[$value])){
$errors[] = "אנא מלא את כל השדות"; // message about empty fields "אנא מלא את כל השדות"}
}
// Validate name field. Accepts a-z, space, period for Dr., and ' for O'Malley
if(isset($_POST['name']) && !empty($_POST['name'])){
if(!preg_match("/^[a-z '.]+$/i",stripslashes($_POST['name']))){
$errors[] = "שם לא חוקי"; // message about invalid name 'שם לא חוקי'
}
}
// Validate email field
if(isset($_POST['email']) && !empty($_POST['email'])){
if(!preg_match("/^[a-z0-9_.-]+@[a-z0-9.-]+.[a-z]{2,6}$/i",stripslashes($_POST['email']))){
$errors[] = "כתובת דואר אלקטרוני אינה תקינה"; /* 'כתובת דואר אלקטרוני אינה תקינה' */ /* message about incorrect email */
}
}
// Display any errors and exit if errors exist.
if (count($errors)) {
$errors = array_unique($errors);
foreach ($errors as $value) {
print "<li> $value</li>";
}
exit;
}
/* Preventing header injection */
// MailChimp API credentials
$apiKey = '17837943924******dbccb48e99-us18';
$listID = 'c0*****c9fa';
// MailChimp API URL
$memberID = hash('sha256', strtolower($_POST['email']));
$dataCenter = substr($apiKey,strpos($apiKey,'-')+1);
$url = 'https://' . $dataCenter . '.api.mailchimp.com/3.0/lists/' . $listID . '/members/' . $memberID;
// member information
$json = json_encode([
'email_address' => $_POST['email'],
'status' => 'subscribed',
'merge_fields' => [
'FNAME' => $_POST['name'],
'PHONE_NUMB'=> $_POST['phone'],
'ADD_INFO' => $_POST['additional_info'],
'C_TYPE' => $_POST['company_type'],
]
]);
// send a HTTP POST request with curl
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_USERPWD, 'user:' . $apiKey);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
$result = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch); ?>
Проблема в том, что ваша функция cleaninjections просто перелистывает некоторые заголовки. Так что для Checkmarx, поскольку существует много заголовков, он рассматривает его как Заголовок HTTP-инъекции возможность
Ну, вы используете пользовательские данные в качестве параметра для curl, даже если вы как бы проверяете ввод и помещаете его в json, все равно может быть какой-то «обход», у меня нет достаточно времени, чтобы подумать возможный способ использовать это, но все же не рекомендуется передавать пользовательские данные в что-то вроде curl.
Сказав это, вы, вероятно, в безопасности, если только потенциальному злоумышленнику каким-то образом не удастся увидеть этот источник, будет довольно сложно использовать это с тестированием черного ящика, к сожалению, я не слишком большой специалист по использованию локонов, но эта статья может В любом случае, как я уже сказал, помощь, вы, вероятно, в безопасности, особенно потому, что вы используете json encode, который как бы дезинфицирует данные, которые вы ему предоставляете.
TL; DR: Вы не должны слишком беспокоиться об этом, потому что вы используете json_encode
https://statuscode.ch/2016/01/subtle-vulnerabilties-with-php-and-curl/