2013-08-07 64 views
0

我要從php代碼插入10字段的值,因爲它是。問題是,無論何時用戶插入撇號和逗號(',)查詢代碼都會受到干擾。一些功能在那裏。但是,是否有必要從這些函數解析所有字段的值? 豈不是耗時:Pphp-mysql數據庫撇號和逗號插入

這裏是我的PHP代碼

$rs = mysql_query(" 
    insert into 
     _{$pid}_item 
    values (
     '$pid', 
     '$item_brand', 
     '$item_code', 
     '$item_name', 
     '$item_quantity', 
     '$item_mrp', 
     '$i‌tem_discount', 
     '$item_vat', 
     '$item_sat', 
     '$item_selling_price', 
     '$item_rating', 
     '$item‌​_image' 
    ) 
"); 

我值傳遞給這些變量..

+0

這將是一個如果你提供一些代碼來看待,而不是迫使我們僱傭算命師來猜測你的錯誤在哪裏;) –

+0

是的,使用[prepared statements](http://php.net/pdo)或[input sanitation]( http://bit.ly/15O36d1)來糾正這個問題。偉大的軟件非常耗時。 :-) – phpisuber01

+0

@HristoValkanov這裏是我的php代碼... $ rs = mysql_query(「insert into _ {$ pid} _item values('$ pid','$ item_brand','$ item_code','$ item_name', '$ item_quantity', '$ item_mrp', '$ item_discount', '$ item_vat', '$ item_sat', '$ item_selling_price', '$ item_rating', '$ item_image')「); 我將這些值傳遞給這些變量.. –

回答

4

試着這麼做mysql_real_escape_string,或者如果使用PDO,使用PDO::quote

而且請請閱讀SQL注入攻擊。這不僅僅是獲取失敗的問題,而是讓攻擊者像訪問其他用戶的信息一樣訪問整個數據庫。

更好的是使用prepared statements。這將是這個樣子:

<?php 
//Use of $pid in the table name is strange here (see comments section) and is 
// dangerous unless you're generating it yourself entirely from known information 
// sources. Otherwise you definitely need to sanitize it, which I don't think 
// prepared statements or quoting can do. 
$stmt = $dbh->prepare(" 
    INSERT INTO 
     :_{$pid}_item 
    VALUES (
     :pid, 
     :item_brand, 
     :item_code, 
     :item_name, 
     :item_quantity, 
     :item_mrp, 
     :i‌tem_discount, 
     :item_vat, 
     :item_sat, 
     :item_selling_price, 
     :item_rating, 
     :item‌​_image) 
"); 

$stmt->bindParam(":pid", $pid); 
$stmt->bindParam(":item_brand", $item_brand); 
$stmt->bindParam(":item_code", $item_code); 
//... etc ... 
$stmt->execute(); 

?> 
+0

在表中使用'$ pid'名字似乎很奇怪的數據庫體系結構。你有'pid'每個可能的vlaue單獨的相同表嗎?爲什麼不把它們全部放在一張表中,因爲無論如何你都有'pid'存儲在行中。這也意味着你不需要擔心清理表名的問題。 – brianmearns

-2
$query = str_replace("\'","''", $query); 
    $query = stripslashes($query); 

我一直在使用這兩個孩子了類似的情況已。我還沒有聽到抱怨。試一試。或者玩吧。

+0

當然不是,爲什麼黑客在得到數據庫轉儲後會抱怨=)。這對於SQL注入攻擊不夠安全。在'addslashes()'的PHP文檔頁面上:「爲了轉義數據庫參數,DBMS特定的轉義函數(例如MySQL的mysqli_real_escape_string()或者PostgreSQL的pg_escape_literal(),pg_escape_string())應該用於安全原因」 – brianmearns

+0

Ohh my ..謝謝 – Rabin

+0

@ sh1ftst0rm thnks .. –

-2

使用addslashes()php函數。

http://php.net/manual/en/function.addslashes.php

而不是像耗時的,因爲你可能認爲。不易察覺。

+0

這對於SQL查詢來說不夠安全。在您鏈接的頁面中:「爲了逃避數據庫參數,DBMS特定的轉義函數(例如MySQL的mysqli_real_escape_string()或PostgreSQL的pg_escape_literal(),pg_escape_string())應該用於安全原因」 – brianmearns

2

有關您的問題的最佳完整說明可以找到here

正如您可能已經注意到的,如果某人能夠輸入任何內容並導致系統崩潰,那麼您的代碼沒有正確實施。

在上面的文章中解釋了避免這種情況的最好方法。有一個愉快的時間閱讀解釋並選擇最適合您的情況的方法。 :)

-2

有時您需要檢查您的標題。

這並不接受撇號:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 

供您使用撇號很好地工作,這是很好的,如果你只是在你的頭可以用這樣的:

<meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/>