2012-01-06 189 views
5

我正在构建一个网站,用户可以使用PHP和mySQL数据库存储代码片段。但我无法弄清楚如何安全地将用户输入的代码插入到我的数据库中。我无法通过我通常使用的“安全”功能(trimstripslashes等)来转换输入,因为整个观点是您可以查看数据库中输入的代码。我看过my_real_escape_string(),但我看到它不能逃过%_,它们可以用作MySQL通配符。这是否构成威胁,或者我可以使用my_real_escape_string?提前Thanx。如何安全地在mySQL数据库中插入代码

+0

['addcslashes'](http://php.net/addcslashes)除了普通转义或参数绑定外,通常用于屏蔽'LIKE'表达式的占位符。 – mario 2012-01-06 14:09:54

+0

trim/stripslashes不是安全功能。除非您担心在固定长度的文本/字符串字段中丢失数据,否则额外的空间在sql中从不担心。 stripslashes是PHP早些时候magic_quotes是国王之王时剩余的垃圾废物。 – 2012-01-06 14:37:09

+0

先前的StackOverFlow问题可以回答你的问题:http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php http://stackoverflow.com/questions/4461759/parameterized - 查询 – 2012-01-06 14:10:49

回答

6

通配符仅在SELECT查询中使用时才起作用,然后仅在使用某些功能时才起作用。所以为了插入代码,可以使用mysql_real_escape_string(),因为它们不会起作用。

为了让它更好,我建议您使用PHPs PDO,以便您可以使用参数绑定。下面的例子是从the PHP manual

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

// insert one row 
$name = 'one'; 
$value = 1; 
$stmt->execute(); 

// insert another row with different values 
$name = 'two'; 
$value = 2; 
$stmt->execute(); 
?> 
1

使用参数化插入语句。实际上,即使对于您的选择和更新也使用参数化。

它会自动为您处理这些事情。

+1

为什么投票? – 2012-01-06 14:11:33

+2

不是我的失望,但它可以说是不是真正的OP的问题的答案。另外你不解释使用哪个库 – 2012-01-06 14:12:35

0

使用PDO:

$dsn = 'mysql:dbname=testdb;host=127.0.0.1'; 
$user = 'dbuser'; 
$password = 'dbpass'; 

try { 
    $dbh = new PDO($dsn, $user, $password); 
} catch (PDOException $e) { 
    echo 'Connection failed: ' . $e->getMessage(); 
} 

$calories = 150; 
$colour = 'red'; 
$sth = $dbh->prepare('INSERT INTO fruit(name, colour, calories) VALUES(?, ?);'); 
$sth->execute(Array($calories, $colour)); 
4

使用mysql_real_escape_string()提供字符串值的完整保护。数据中可能有%_这一事实并不相关,它们不构成安全威胁。

对于int值,你需要或者验证它们是否真的是数字,或将其包装成语录:

$intValue = mysql_real_escape_string($_POST["intValue"]); 
$query = mysql_query("INSERT INTO table SET intValue ='$intValue'"); 
                 // note the quotes 

不带引号,mysql_real_escape_string()是没用的数值!

但是,正如@丹尼尔·A·怀特所说,如果你刚刚开始,请考虑使用PDO library来代替。它比旧的mySQL函数更新,并提供参数化查询,如果使用得当,将使SQL注入变得不可能。

0

这是为我工作的,[adscript]是一个代码片段。

<textarea rows="6" cols="80"><input name="adscript" type="text/javascript" class="text-input textarea" id="adscript" value="<?php echo htmlentities($row['adscript']);?>" size="80" height="40" maxlength="1000"></textarea>