首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这样做是否可以停止sql注入

这样做是否可以停止sql注入
EN

Stack Overflow用户
提问于 2011-11-12 23:50:24
回答 5查看 762关注 0票数 3

我一直在使用下面的代码块来停止sql注入。这是我刚开始使用php的时候(不久前)有人给我看过的东西。

我把它放在每个页面上,就像在打开时显示的那样。我想知道它是否有效?我不知道如何测试sql注入

代码语言:javascript
复制
<?php

//Start the session

session_start();


//=======================open connection

include ('lib/dbconfig.php');

//===============This stops SQL Injection in POST vars

  foreach ($_POST as $key => $value) {
    $_POST[$key] = mysql_real_escape_string($value);
  }

  foreach ($_GET as $key => $value) {
    $_GET[$key] = mysql_real_escape_string($value);
  }

我典型的插入和更新查询如下所示

代码语言:javascript
复制
$insert = ("'$email','$pw','$company', '$co_description', '$categroy', '$url', '$street', '$suite', '$city', '$state', '$zip', '$phone', '$date', '$actkey'");

mysql_query("INSERT INTO provider (email, pw, company, co_description, category, url, street, suite, city, state, zip, phone, regdate, actkey) VALUES ($insert)") or die ('error ' . mysql_error());

mysql_query("UPDATE coupon SET head='$_POST[head]', fineprint='$_POST[fineprint]', exdate='$exdate', creationdate=NOW() WHERE id='$cid'") or die ('error ' . mysql_error());
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-11-13 00:04:23

这还不够。1.您缺少cookies,$_COOKIE变量。2.如果你使用$_REQUEST,你就有麻烦了。3.你没有显示你的查询,当你把它放入查询时,你必须用单引号将每个变量括起来(特别是当数据被支持为整数时,你可能认为在这种情况下不需要引号,但这将是一个很大的错误)。4.查询中使用的数据可能来自其他来源。

最好的方法是使用数据绑定,并由驱动程序自动转义数据,这在PDO扩展中可用。

示例代码:

代码语言:javascript
复制
$PDO = new PDO('mysql:dbname=testdb;host=127.0.0.1' $user, $password);
$stmt = $PDO->prepare("SELECT * FROM test WHERE id=? AND cat=?");
$stmt->execute(array($_GET["id"], $_GET["cat"]));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

您还可以使用字符串键绑定数据:

代码语言:javascript
复制
$stmt = $PDO->prepare("SELECT * FROM test WHERE id = :id AND cat = :cat");
$stmt->execute(array(":id" => $_GET["id"], ":cat" => $_GET["cat"]));

如果你想学习PDO,你可能会发现我使用的这些辅助函数很有用:

http://www.gosu.pl/var/PDO.txt

代码语言:javascript
复制
PDO_Connect(dsn, user, passwd) - connects and sets error handling.
PDO_Execute(query [, params]) - only execute query, do not fetch any data.
PDO_InsertId() - last insert id.

PDO_FetchOne(query [, params]) - fetch 1 value, $count = PDO_FetchOne("SELECT COUNT(*) ..");
PDO_FetchRow(query [, params]) - fetch 1 row.
PDO_FetchAll(query [, params]) - fetch all rows.
PDO_FetchAssoc(query [, params]) - returns an associative array, when you need 1 or 2 cols

1) $names = PDO_FetchAssoc("SELECT name FROM table");
the returned array is: array(name, name, ...)

2) $assoc = PDO_FetchAssoc("SELECT id, name FROM table")
the returned array is: array(id=> name, id=>name, ...)

3) $assoc = PDO_FetchAssoc("SELECT id, name, other FROM table");
the returned array is: array(id=> array(id=>'',name=>'',other=>''), id=>array(..), ..)

每个获取数据的函数都接受第二个参数数组(这是可选的),用于针对sql注入自动绑定数据。它的用法在这篇文章的前面已经介绍过了。

票数 3
EN

Stack Overflow用户

发布于 2011-11-12 23:54:47

这在某种程度上是有效的,但它并不是最优的--您在_GET和_POST中接收的数据并不都会进入数据库。有时,您可能希望将其显示在页面上,在这种情况下,mysql_real_escape_string只会带来负面影响(相反,您可能希望使用htmlentities)。

我的经验法则是,只在将某些东西放入需要转义的上下文之前立即对其进行转义。

在这种情况下,最好只使用参数化查询--然后自动进行转义。

票数 4
EN

Stack Overflow用户

发布于 2011-11-13 00:01:21

有点。

mysql_real_escape_string函数接受给定的变量并对其进行转义以进行SQL查询。因此,您可以安全地将该字符串附加到查询中,如

代码语言:javascript
复制
$safe =  mysql_real_escape_string($unsafe_string);
$query = 'SELECT * FROM MyTable WHERE Name LIKE "' . $safe . '" LIMIT 1';

它不能防止有人将恶意代码放入稍后显示的查询中(即XSS或类似的攻击)。因此,如果有人将变量设置为

代码语言:javascript
复制
// $unsafe_string = '<script src="http://dangerous.org/script.js"></script>'
$safe =  mysql_real_escape_string($unsafe_string);
$query = 'UPDATE MyTable SET Name = "' . $safe . '"';

该查询将按预期执行,但现在在打印此人姓名的任何页面上,都将执行他的脚本。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8105508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档