2014-04-07 51 views
1

當談到PHP時,我有些小氣,所以如果這是非常基本的道歉。這個問題可能以前曾被問過,但我無法找到與我的類似案例的另一篇文章。 我網站上的URL示例是example.com/read.php?id=1。該read.php文件包含以下代碼:PHP從數據庫中讀取字符串時的淨化字符串

<?php 
    $id = $_GET['id']; 
    $sql = mysqli_query($con, "SELECT * FROM pages WHERE id='$id'"); 
?> 

我知道我需要做一些衛生到這一點,但是這將是在這種情況下,這樣做的最佳方式?性能也很重要,所以我不想添加不必要的代碼。

+3

從這裏開始=> http://stackoverflow.com/q/60174/並使用[** prepared statements **](http://www.php.net/manual /en/mysqli.quickstart.prepared-statements.php)或[** PDO **](http://php.net/pdo) –

+0

如果性能確實非常重要,那麼可以將該值轉換爲整數甚至刪除變量周圍的引號。但是,準備好的聲明可能是最好的解決方案...... – jeroen

+1

性能永遠不會比安全性更重要 –

回答

0

您可以使用filter_var()函數。有很多類型的過濾器可用。

訪問此鏈接:http://www.php.net/manual/en/filter.filters.php

你可以得到$ ID和驗證這樣的:

filter_var($id,FILTER_VALIDATE_INT); 

上述函數將返回過濾後的數據,或FALSE如果過濾器失敗。 驗證完成後,您可以使用準備好的語句和PDO完成工作。

準備語句:

http://in2.php.net/manual/en/mysqli.prepare.php

對於PDO: http://in2.php.net/manual/en/book.pdo.php

1

的最簡單的解決方法是迫使該變量是整數。任何非數字都會被刪除,並且該值可以安全地用作數字值。

$id = (int) $_GET['id']; 
$sql = mysqli_query($con, "SELECT * FROM pages WHERE id=$id"); 

我與其他評論者認爲,這是更好的(更快,更安全)使用預準備的查詢與參數。然後它看起來像這樣:

$id = (int) $_GET['id']; 
$stmt = mysqli_prepare($con, "SELECT * FROM pages WHERE id=?"); 
mysqli_stmt_bind_param($stmt, "i", $id); 
+0

我的觀點正好。 –