PHP acemi güvenlik sorusu

3 Cevap php
<?php

$id = intval($_GET['id']);

 $sql = mysql_query("SELECT username FROM users WHERE id = $id");
 $row = mysql_fetch_assoc($sql);

$user = htmlspecialchars($row['username']);

?>

<h1>User:<?php echo $user ?></h1>

Yukarıdaki kodda herhangi bir tehdit görebiliyor musunuz? Ben her şeyi çıkışında htmlspecialchars kullanmak zorunda mı? Ve ben get sayısal böylece kontrol is_numeric veya intval kullanmalıyım?

Ben sadece minimal bir site inşa. Yukarıdaki kod xss, sql enjeksiyon vurneable ise Im sadece merak?

3 Cevap

Ben kuvvetle PDO ve hazırlanmış deyimleri kullanarak öneriyoruz. Lütfen Yukarıdaki açıklamalarımızın güvenli görünüyor olsa da, kısa sürede daha karmaşık sorguları yapmak gibi sorunları var olacak.

Bunun yerine belirli bir sorgu güvenli olup olmadığı üzerinde şaşırtıcı, hazırlanmış tablolar hakkında bilgi edinmek ve endişelenmenize gerek olmayacaktır. İşte örnek PDO ile yeniden yazılmış gibidir:

# Make a database connection
$db = new PDO('mysql:dbname=your_db;host=your_db_server', 'username',
    'password');

# The placeholder (:id) will be replaced with the actual value
$sql = 'SELECT username FROM users WHERE id=:id';

# Prepare the statement
$stmt = $db->prepare($sql);

# Now replace the placeholder (:id) with the actual value. This
# is called "binding" the value. Note that you don't have to
# convert it or escape it when you do it this way.
$stmt->bindValue(':id', $id);

# Run the query
$stmt->execute();

# Get the results
$row = $stmt->fetch();

# Clean up
$stmt->closeCursor();

# Do your stuff
$user = htmlspecialchars($row['username']);

Ben bir sürü yorum ekledik; Göründüğü gibi o kadar çok kod değil. Eğer bindValue kullandığınızda, SQL enjeksiyonu konusunda endişelenmenize gerek asla.

Eh,

You are casting the receied id to an int ; so no possible SQL injection here.
And the rest of the DB query is "hard-coded", so no problem there either.

Id DB bir dize olsaydı, mysql_real_escape_string , but for an integer, intval doğru aracı kullanmak gerekiyor :-)


About the output, you are escaping data too (and, as you are outputting HTML, htmlspecialchars is OK); böylece hiçbir HTML / JS enjeksiyon.


Yani, bu kod kısa bölümü :-) bana görünüyor Tamam


As a sidenote, if you are starting developping a new website, it is the moment or never to take a look at either mysqli (instead of mysql), and/or PDO ;-)

Bu, örneğin, prepared statements gibi, MySQL son sürümleri tarafından sağlanan functionnalities kullanmak için izin verecek - SQL enjeksiyon kendinizi korumak için iyi bir yoldur hangi!