Farklı Domain PHP Gönderen Konu Veri Durdur

5 Cevap php

PHP bir acemi değilim.

Ne yapmaya çalışıyorum post Veri başka bir web sayfasına gelen durdurmak olduğunu.

Ben yaşıyorum sorun en kendi sitesinde birisi kopya benim form ve yapıştırır diyelim olduğunu. Benim e-posta formunda komut dosyası çalıştırılırken o post Veri durdurmak mümkün olmak istiyorum.

Bunu nasıl yapabilirim? Ben yeterince açık olmak değilim varsa bana bildirin.

Benim PHP İletişim formu koşullu ifadeleri ile tek bir sayfada çalışır. veri denetler, yani eğer, gönderin.

5 Cevap

$ _SERVER ['HTTP_Referrer'] güzel olurdu ama güvenilir değildir. Daha sonra MD5'in şey ve diğer tarafta kontrol gizli bir form alanı kullanabilirsiniz.

Sen CSRF - Cross-Site Request Forgery önlemeye çalışıyoruz. Jeff himself bu konuda bir blog yazı vardır.

Gerçek XSRF Önleme üç bölümden gerektirir:

  • Sadece formu kapış ve gömme birisi önlemek için gizli giriş alanları,
  • Aksi takdirde birisi bir zamanlar geçerli bir form oluşturmak ve (depolandığı impementation / nasıl bağlı) belirteci kullanabilir, oluşturulan formun bir epsilon içinde timechecking
  • Çerezler: Bu bir müşteri gibi davranarak, ve bir man-in-the-middle saldırıyı gerçekleştiren kötü niyetli bir sunucu önlemek için

Eğer kirli bir hızlı-ve-bir yaklaşım arıyorsanız, size REFERER başlığını kontrol edebilirsiniz.

Eğer gerçekten formu olsa sitenizden getirilen emin olmak istiyorsanız, bir belirteç formu yüklenen her zaman oluşturmak ve bir oturumda bunu eklemek gerekir. Bunu yapmak için basit bir yolu gibi bir şey olurdu:

$_SESSION['formToken'] = sha1(microtime());

Sonra form gizli girişi olabilir:

<input type="hidden" name="token" value='<?=$_SESSION['formToken'];?>' />

Form verileri işlemek için karar verirken ve bunu kontrol edebilirsiniz.

Formunda:

<?
$password = "mypass"; //change to something only you know
$hash = md5($password . $_SERVER['REMOTE_ADDR']);
echo "<input type=\"hidden\" name=\"iphash\" value=\"$hash\"/>";
?>

Eğer kontrol ediyoruz:

$password = "mypass"; //same as above
if ($_POST['iphash'] == md5($password . $_SERVER['REMOTE_ADDR'])) {
    //fine
}
else {
    //error
}

Bunun gibi iki gizli alanları ekleyin:

<?php
$time = time();
$_SESSION['time'] = $time;
/*
 *This is a Perfect Password from Steve Gibbson's site https://www.grc.com/passwords.htm
 *It should make for a great Salt.
 */
$salt = 'b79jsMaEzXMvCO2iWtzU2gT7rBoRmQzlvj5yNVgP4aGOrZ524pT5KoTDJ7vNiIN';
$token = sha1($salt . $time);
?>
<input type="hidden" name="token" value="<?php echo $token; ?>" />

Eğer kimlik doğrulaması yapmak o zaman bu gibi bir kod kullanacağız:

<?php
$salt = 'b79jsMaEzXMvCO2iWtzU2gT7rBoRmQzlvj5yNVgP4aGOrZ524pT5KoTDJ7vNiIN';
$token = sha1($salt . $_SESSION['time']);
if($token != $_POST['token'])
{
die('you stupid scum sucking bandwidth hog!');
}
//Rest of form validation
?>

Bu mükemmel bir sistem değildir ve 2 şeylerden biri çatlamak gerekli olacağını ancak, kırık olabilir:

  1. Your salt (be sure you keep it secure)
  2. ALOT of time, this could take several thousands of years to brute force so don't worry about this.

EDIT: Ben yapılan bariz hata için hesap azından oturumda zaman değişken değilse, hem zaman ve karma geçmek benim cevap güncellendi. Birisi zaten berbat durumda, sunucuya erişimi olan sürece kullanarak sunucu tarafı oturumları değil, çerez seans sonra tahrif edilemez varsayarsak.