2012-06-28 67 views
1

我开始一个非常基本的网站,它使用单行表单发布到数据库中,然后在页面上回显$comment变量。我不知道PDO,但愿意了解我是否真的需要这样简单的事情。我很担心SQL注入。这安全吗?

else 
mysql_query("INSERT INTO posts (postid, post_content) 
VALUES ('', '$comment <br />')"); 
} 
mysql_close($con); 

上面这段代码我有基本的strpos命令来阻止一些我不想发布的东西。

我是否会遇到任何注射问题,从我如何做到这一点?

+4

开始学习准备语句中使用'PDO',而你在它 – tradyblix

+0

PDO可以看看在开始恐吓。但是做基本的查询几乎是相同数量的代码ad mysqli。另外,一旦你需要/想要更高级的功能,那就是它照在mysqli上的地方 – Kris

回答

3

不,这不是安全的,你需要使用mysql_real_escape_string逃脱$comment

但是,PDO并不困难,使您的代码更强大。

// create the connection. something like mysql_connect/mysql_error 
try { 
    $dbh = new PDO($dsn, $user, $password); 
} catch (PDOException $e) { 
    echo 'Connection failed: ' . $e->getMessage(); 
} 

// create the prepared statement. 
$stmt = $dbh->prepare("INSERT INTO posts (postid, post_content) VALUES (?, ?)"); 
// execute it with parameters. 
$stmt->execute(array('', $comment.'<br>')); 
+1

+1用于演示PDO以及它的使用方式。 – Herbert

3

是的,这是危险的。所有人需要做的就是把单引号,然后是他们想要的SQL代码。如果您想以旧方式修复它,或者使用PDO准备好的语句作为更新的方式,请在此声明之前使用$ comment = mysql_real_escape_string($ comment)。下面是从documentation一个基本的例子:

<?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(); 
?> 
+0

我已经看到过这个,并在之前阅读过它。 mysql_real_escape_string()到底是什么?做? – CodingNoob

+0

有一些字符(如单引号)需要转义,所以它会根据所使用的转义版本将所有'转换为'或''。 [文档](http://php.net/manual/en/function.mysql-real-escape-string.php) – hackartist

0

这是容易受到SQL注入作为你的$评论是他们可能也进入了一些SQL命令和你的PHP代码最终会执行相同的用户输入。

考虑$评论值设置为'TRUNCATE TABLE USERS;'用户表可以是任何东西,这可能是您的应用程序的关键。

在PHP中,我相信你通过使用mysql_real_escape_string()来防止sql注入。阅读它。

请参阅本文档的详细信息ABT SQL innjection:https://docs.google.com/document/d/1rO_LCBKJY0puvRhPhAfTD2iNVPfR4e9KiKDpDE2enMI/edit?pli=1

0

将输入数据绑定到mysql查询是SQL注入的完美解决方案。为此使用binaParam方法。

0

不,仅根据您在此处发布的代码判断,您不受SQL注入的保护。这里有一个简单的例子为$comment

'), (null, (select concat(user(),':',password) s from mysql.user where concat(user,'@',host)=user() LIMIT 1) -- 

这将添加包含当前用户的登录凭据另一行。通过LOAD_FILE,他也可以读取文件系统中的文件。他还可以写在文件系统上的任意文件:

' + (select '<?php echo "Hello, World!";' into dumpfile '/path/to/your/document_root/foobar.php')) -- 

利用这种技术,攻击者可以任意上传文件到您的服务器,E。 G。一个web shell在您的系统上运行任意命令。

所以你一定要protect yourself against SQL injections使用准备好的语句或参数化语句的自动转义比使用mysql_real_escape_string等功能的手动转义更受青睐。