Skip to main content

Lack of data validation - Web Service

Need

Implementation of proper data validation and input sanitization in the web service

Context

  • Usage of PHP for server-side scripting and web development
  • Usage of Request for making HTTP requests
  • Usage of the User dependency for user-related functionality
  • Usage of Hash for data encryption and password hashing

Description

Non compliant code

public function store(Request $request)
{
$user = new User;
$user->name = $request->name;
$user->email = $request->email;
$user->password = Hash::make($request->password);
$user->save();
}

This code is an example of a function in Laravel that is used to store user data. It takes a request as input and directly assigns the values from the request to the fields of a new User object.

The vulnerability lies in the fact that there is no validation of the data coming from the request. The application does not control on the server side the data being sent in certain fields and allows the use of special characters. This can lead to various types of attacks, such as SQL injection, cross-site scripting (XSS), and buffer overflow attacks.

In addition, there is no control over the size of the fields that can be sent to the server. This can lead to a buffer overflow attack, where an attacker sends more data than the buffer can handle, causing it to overflow and potentially allowing the attacker to execute arbitrary code.

The lack of data validation and control over the size of the fields also violates the security principle of least privilege, which states that a user should only be able to access the resources and operations that are necessary for their legitimate purpose. In this case, the user is able to send any data they want to the server, which is a clear violation of this principle.

Steps

  • Implement server-side validation for all incoming data. This includes checking for null values, data types, and the size of the data.
  • Sanitize all incoming data to remove any potentially harmful characters that could lead to SQL injection or cross-site scripting attacks.
  • Limit the size of the fields that can be sent to the server to prevent buffer overflow attacks.
  • Use a library or framework that provides built-in protection against common web vulnerabilities.
  • Regularly update and patch your server and all software to protect against known vulnerabilities.

Compliant code

public function store(Request $request)
{
$validatedData = $request->validate([
'name' => 'required|max:255|regex:/^[a-zA-Z0-9\\s]+$/',
'email' => 'required|email|max:255',
'password' => 'required|min:8',
]);

$user = new User;
$user->name = $validatedData['name'];
$user->email = $validatedData['email'];
$user->password = Hash::make($validatedData['password']);
$user->save();
}

The updated code now includes server-side validation for all incoming data using Laravel's built-in validation rules.

  • The 'name' field is now required, has a maximum length of 255 characters, and only allows alphanumeric characters and spaces. This is done using the 'required', 'max', and 'regex' validation rules respectively.
  • The 'email' field is now required, must be a valid email format, and has a maximum length of 255 characters. This is done using the 'required', 'email', and 'max' validation rules respectively.
  • The 'password' field is now required and must be at least 8 characters long. This is done using the 'required' and 'min' validation rules respectively.

The validated data is then used to create a new User object. This ensures that only valid and sanitized data is stored in the database, protecting against SQL injection and cross-site scripting attacks.

In addition, by limiting the size of the fields that can be sent to the server, we also prevent potential buffer overflow attacks.

This solution leverages Laravel's built-in protection against common web vulnerabilities, providing a robust and secure way to handle user data.

References