2013-08-07 66 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"/>