XSRF
XSRF
XSRF
XSRF
http://trustedbank.com/
<img src="http://trustedbank.com/
withdraw?amount=1000000&for=Fred">
XSRF
<img src="http://trustedbank.com/
withdraw?amount=1000000&for=Fred">
http://trustedbank.com/
<img src="http://trustedbank.com/
withdraw?amount=1000000&for=Fred">
<img src="http://trustedbank.com/
withdraw?amount=1000000&for=Fred">
<img src="http://trustedbank.com/
withdraw?amount=1000000&for=Fred">
$add_query =
"UPDATE BankAccounts SET account_balance = account_balance + $amount where account_id = $to_id";
echo $add_query;
$conn->query($add_query);
$conn->close();
}
XSRF
$conn = getDatabaseConnection();
$add_query =
"UPDATE BankAccounts SET account_balance = account_balance + $amount where account_id = $to_id";
$conn->close();
}
echo "Transferring funds <br>";
XSRF
$from_id = $conn->real_escape_string($_GET['from_id']);
$to_id = $conn->real_escape_string($_GET['to_id']);
$amount = $conn->real_escape_string($_GET['amount']);
echo "From: $from_id, To: $to_id, Amount: $amount <br>";
$add_query =
"UPDATE BankAccounts SET account_balance = account_balance + $amount where account_id = $to_id";
echo $add_query;
$conn->query($add_query);
$conn->close();
}
$add_query =
"UPDATE BankAccounts SET account_balance = account_balance + $amount where account_id = $to_id";
echo $add_query;
$conn->query($add_query);
$conn->close();
}
$add_query =
"UPDATE BankAccounts SET account_balance = account_balance + $amount where account_id = $to_id";
echo $add_query;
$conn->query($add_query);
$conn->close();
}
XSRF
<body onload="document.forms[0].submit()">
1. Referer header
2. Origin header
3. Challenge response
4. Synchronizer token
XSRF
Mitigation - Referer header
1. Referer header
2. Origin header
3. Challenge response
4. Synchronizer token
XSRF
Mitigation - Origin header
This is a special header the browser
adds when the request is made to a
domain which is different from the
page making the request
1. Referer header
2. Origin header
3. Challenge response
4. Synchronizer token
XSRF
Mitigation - Challenge response
1. Referer header
2. Origin header
3. Challenge response
4. Synchronizer token
XSRF
Mitigation - Synchronizer token
</form>
<br>
<a href="Example26-login.php"> Already a member? Login </a>
in the database
<input type="hidden" name="form_token" value="<?php echo $form_token; ?>" />
SIGNING UP USERS
<h3> Sign up to our new Top Secret Club! </h3>
<form method="POST" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
<br>
<br>
Hmm… everything looks
<span style="color: red"><?php echo $error_message;?></span>
$form_token
<br>
Password:
<br>
<input type="text" name="user_password" maxlength="20">
<br>
<br>
<input type="submit" value="Sign up">
<input type="hidden" name="form_token" value="<?php echo $form_token; ?>" />
</form>
<br>
<a href="Example26-login.php"> Already a member? Login </a>
SIGNING UP USERS
Sendonce
this per
random session
identifier to the
ser ver along with every form submit
requests
Send across
this random that
identifier to session
the
ser ver along with every form submit
<br>
<br>
Make sure you always send
<span style="color: red"><?php echo $error_message;?></span>
try {
$conn = getDatabaseConnection();
$stmt = $conn->prepare(
"INSERT INTO `Users` (user_email, user_password) VALUES (?, ?)"
);
$stmt->bind_param("ss", $user_email, sha1($user_password));
$stmt->execute();
$stmt->close();
$conn->close();
} catch (Exception $e) {
// Duplicate entry for key is error 1062
if($e->getCode() == 1062) {
$error_message =
'Username already exists, please sign in or choose a different user name';
}
else {
$error_message =
'We are unable to process your request. Please try again later';
}
}
}
}
SIGNING UP USERS
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$error_message = validate_inputs($_POST['user_email'], $_POST['user_password'], $form_token);
// If no errors then add the user to the database.
if (empty($error_message)) {
try {
$conn = getDatabaseConnection();
$stmt = $conn->prepare(
"INSERT INTO `Users` (user_email, user_password) VALUES (?, ?)"
);
$stmt->bind_param("ss", $user_email, sha1($user_password));
$stmt->execute();
$stmt->close();
$conn->close();
} catch (Exception $e) {
// Duplicate entry for key is error 1062
if($e->getCode() == 1062) {
$error_message =
'Username already exists, please sign in or choose a different user name';
}
else {
$error_message =
'We are unable to process your request. Please try again later';
}
}
}
Users table
SIGNING UP USERS
return $error;
}
SIGNING UP USERS
function validate_inputs($user_email, $user_password, $form_token) {
$error = "";
}
part
} elseif (!ctype_alnum($user_password)) {
$error = 'The password should only have alphabets or numbers';
return $error;
}
SIGNING UP USERS
function validate_inputs($user_email, $user_password, $form_token) {
$error = "";
1. Referer header
2. Origin header
3. Challenge response
4. Synchronizer token