Bu PHP kodu ne kadar tehlikeli?

10 Cevap php

Bu kodu php ne kadar tehlikeli? Bu konuda ne yapılabilir?

$name = $_POST["user"];
$pwd = $_POST["pwd"];
$query = "SELECT name,pwd FROM users WHERE name = '$name' AND pwd = '$pwd'";

10 Cevap

Olası Sorunlar:

  1. SQL Injection
  2. XSS Enjeksiyon (bu kod, bir ekleme sorgusu olsaydı, o bir definate sorun olurdu)
  3. Düz Metin Şifre

SQL Bildirimi sorunlu olabilir. Bu sql enjeksiyon için kendinizi açık bırakmak için kötü bir uygulamadır.

SQL Injection is bad. Güven bana.

Bir HTML sayfasında $ kullanıcıyı görüntülemek istiyorsanız, o zaman gibi komutları yazarak düzenini "hack" insanlar için yeteneği dahil etmek istemeyebilirsiniz

<H1>HI MOM</H1>

ya da bir demet javascript.

Ayrıca, düz metin şifrenizi saklamak asla (iyi yakalamak cagcowboy!). İnsanların uygulanmasını (veya hack) veritabanı çok fazla güç verir. Birinin şifreyi bilmek İHTİYACINIZ asla.

Bu gibi taktikleri deneyin:

// mostly pulled from http://snippets.dzone.com/posts/show/2738
function MakeSafe($unsafestring) 
{
    $unsafestring= htmlentities($unsafestring, ENT_QUOTES);

    if (get_magic_quotes_gpc()) 
    { 
        $unsafestring= stripslashes($unsafestring); 
    }

    $unsafestring= mysql_real_escape_string(trim($unsafestring));
    $unsafestring= strip_tags($unsafestring);
    $unsafestring= str_replace("\r\n", "", $unsafestring);

    return $unsafestring;
} 

// Call a function to make sure the variables you are 
// pulling in are not able to inject sql into your 
// sql statement causing massive doom and destruction.

$name = MakeSafe( $_POST["user"] );
$pwd = MakeSafe( $_POST["pwd"] );

// As suggested by cagcowboy: 
// You should NEVER store passwords decrypted.
// Ever.  
// sha1 creates a hash of your password
// pack helps to shrink your hash
// base64_encode turns it into base64
$pwd = base64_encode(pack("H*",sha1($pwd)))

Bir SQL veritabanı $ sorgu geçmek asla eğer bu kod çok güvenlidir.

Şifrelerinizi büyük değil, düz metin olarak depolanıyor olabilir gibi bir kenara SQL Injection, görünüyor.

Tek bir isim için 0';drop table users;-- göndermek için olsaydı

Komut olmanın sona ereceğini

select name, pwd form users where name='0'; 
drop table users; --'and pwd = '[VALUE OF PWD]'

Bu bir yorumdur beri bu yüzden ilk önce kullanıcıların masa öldürmek sonra, veri almak ve geri kalanı ile bir şey yapacağını.

Sql geçtiğinde php bazı mysql komutları birden sorguları yapacak, bunu önlemek için en iyi yoldur parametrized sorgularını.

Ben bütün DB erişim için PDO kullanmak ve bunu tavsiye ederim. Kafamın üst kapalı herhangi bir bağlantıları yok ama ben Google tepesinde kullanılan öğreticiler hatırlıyorum.

Bu sadece SQL enjeksiyon eğilimli, aynı zamanda bir enjeksiyon bile uygun değildir durumlarda başarısız olur:

Örneğin kullanıcı adı "Guillaume François Antoine, Marquis de L'Hospital" istiyor. Adı bir alıntı içerir ve bunu kaçan olmadığından kullanıcı sistemi kırmak istemedim rağmen, sorgu başarısız olur!

Kullanmak PDO veya bu şekilde bunu ya:

$query = sprintf(
                   "SELECT 1 FROM users WHERE name = '%s' AND password = '%s'",
                   mysql_real_escape_string($_POST['name']),
                   mysql_real_escape_string(md5($_POST['password']))
                 );

magic_quotes_gpc açıksa İster inanın ister inanmayın, bu ... güvenlidir. Hangisi PHP6 olması, bu yüzden önce sonra sabitlemek iyi bir fikir olduğunu asla.

  1. $_POST['user'] = "' or 1=1; --"; Anyone gets instant access to your app

  2. $_POST['user'] = "'; DROP TABLE user; --"; Kiss your (paid?) user list goodbye

  3. Eğer daha sonra çıktı $ isim echo eğer, bu bir XSS enjeksiyon saldırısı neden olabilir

Bu genellikle çok tehlikelidir. Bazı durumlarda veritabanı izinleri ile hafifletilebilir.

Sen girişi ($ isim ve $ pwd) doğrulamaz. Bir kullanıcı bu alanların birinde veya her ikisinde de SQL gönderebilir. SQL veritabanındaki diğer verileri silebilir veya değiştirebilir.

Very very dangerous. A good idea for passwords is to convert the password into a MD5 hash and store that as the user's 'password'.
1) protects the users from having their passwords stolen 2) if a user writes a malicious string they could wipe out your entry/table/database

Ayrıca emin sadece A-Za-z0-9 kullanır ve belki bir kaç aksanlı karakterler (özel karakterler * 'nin, <' s> 'ın özellikle yapmak adına bazı temel maç regex ifadesini yapmalıyım .)