2015-06-21 143 views
0

我使用unity將值傳遞給我的PHP腳本與HTTP GET。我是新來的PHP,只是讓我的腳本工作,但是,我想確保我可以防止SQL注入。有人可以看看這個,讓我知道我需要改變以保護它嗎?PHP + SQL腳本 - 防止SQL注入

<?php 

$servername = "localhost"; 
$username = "Test"; 
$password = "Test"; 
$dbname = "Test"; 

$userId = $_GET['userId']; 

// Create connection 
$conn = new mysqli($servername, $username, $password, $dbname); 
// Check connection 
if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 

$sql = "SELECT rp FROM RP where userID = '$userId'"; 
$result = $conn->query($sql); 

if ($result->num_rows > 0) { 
    // output data of each row 
    while($row = $result->fetch_assoc()) { 
     //echo "UserID: " . $row["userID"]. " - RP: " . $row["rp"]."<br>"; 
    echo "RP: " . $row["rp"]."<br>"; 
    } 
} else { 
    echo "0 results"; 
} 
$conn->close(); 
?> 
+3

https://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php?rq=1 –

+0

不要使用'query('use' prepare''' execute '並且將值傳遞給執行請參見上面的鏈接^ – chris85

回答

1

防止sql注入 - 使用預處理語句。 這裏的鏈接: http://php.net/manual/en/mysqli.quickstart.prepared-statements.php

修訂

實施例:

$id = 5; 

$c = new mysqli($servername, $username, $password, $dbname); 
$s = $c->prepare("SELECT * FROM RP WHERE id = ?"); 
$s->bind_param('s', $id); 
$s->execute(); 
$r = $s->get_result(); 
$f = $r->fetch_assoc(); 

echo $f['rp']; 

修訂

例子#2:

$id = 5; 
$rp = "lalala"; 
$rp2 = "boomboomboom"; 

$c = new mysqli($servername, $username, $password, $dbname); 
$s = $c->prepare("UPDATE RP SET rp = ?, rp2 = ? WHERE userID = ?"); 
$s->bind_param('sss', $rp, $rp2, $id); 
$s->execute(); 
+0

這是一條評論 – chris85

+0

已更新的回答 – Boris

+0

如果我想在prepare語句中傳遞多個值,我該如何做?更新金額和userId –

1

在這種特殊情況下,您可以檢查$ _GET ['userId']是否爲數字is_numeric()。如果不是,則觸發錯誤並退出。

但是,這只是像這些簡單的情況。您應該閱讀以下內容:How can I prevent SQL-injection in PHP?

您需要的是稱爲準備好的語句,據我所知在理論上應該是不可能打破的。 您將可以在Mysqli和PDO中準備好的語句中進行選擇。它的靈活性非常小,所以我的建議是在每週的任何一天與PDO一起去。

只是爲了澄清 - 你的代碼完全傾向於注入。所有需要做的就是在查詢字符串中使用Mysql命令,腳本將像執行它一樣執行它。