2015-06-21 150 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命令,脚本将像执行它一样执行它。