2013-06-29 13 views
-1

我根據url動態創建用於執行的sql語句。我這樣做他們:根據來自查詢字符串的輸入創建Sql語句

URL (using htaccess): 
`http://www.example.com/us/california/sanjose` 

Which translates to: 
`http://www.example.com/index.php?country=US&state=california&sub=sanjose` 

Then, in my script I do: 
$sql = 'select * from table where'; 

if(isset($_GET['country'])){ 
$sql .= ' country='.$_GET['country']; 
} else { 
$sql .= ' country=US'; 
} 

if(isset($_GET['state'])){ 
$sql .= ' and state='.$_GET['state']; 
} 

if(isset($_GET['sub'])){ 
$sql .= ' and sub='.$_GET['sub']; 
} 

//PDO 
execute $SQL 

這就是我如何做到這一點。有沒有更好,更乾淨的方法來做到這一點?基於url創建sql語句?你會怎麼做這樣的事情?

+0

除了安全問題,對我來說似乎很好,但這不是代碼審查 – 2013-06-29 04:25:51

+0

您的代碼易受** [SQL注入](http://en.wikipedia.org/wiki/SQL_injection)**的影響。 – Aiias

+0

@dagon,@alias'htaccess規則'只允許'a-z'。你認爲安全仍然是一個問題? – Norman

回答

1

除了容易受到SQL注入的影響,您如何去做這件事並沒有什麼錯。

爲了防止SQL注入,使用準備的語句:

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); 
$stmt->bindParam(':name', $name); 
$stmt->bindParam(':value', $value); 

具體地,「bindParam」的方法是什麼,通過適當轉義在查詢中的值防止了SQL注入。

http://php.net/manual/en/pdo.prepared-statements.php

+0

'htaccess規則'我只允許'a-z',是的,我使用'PDO' – Norman

+0

@Norman看到我的更新示例。您應該使用bindParam方法$ _GET ['country']和其他變量,而不是附加到$ sql字符串。 – Seth

0

看看http://j4mie.github.io/idiormandparis/

Idiorm是一口流利的查詢生成器,上面的代碼將成爲:

$query = ORM::for_table('table_name') 

if(isset($_GET['country'])){ 
    $query->where_equal('country', $_GET['country']); 
} else { 
    $query->where_equal('country', 'US'); 
} 

if(isset($_GET['state'])) { 
    $query->where_equal('state', $_GET['state']); 
} 

if(isset($_GET['sub'])) { 
    $query->where_equal('sub', $_GET['sub']); 
} 

$results = $query->find_many(); 

最好的這一切使用預處理語句,所以你得到適當的轉義在上面發佈的代碼中關閉一個很大的安全漏洞。 (谷歌的SQL注入)