如何在php中清理从url到mysql的简单_GET输入

时间:2011-05-27 05:23:22

标签: php mysql html get sanitization

我有一个简单的PHP脚本,希望人们可以简单地转到http://mydomain.com/get.php?id=TEXTMASH-1FD0066D-F75A-5D0C-6784-2FA0D055B0D7之类的东西,并从我的mysql数据库中提取这个文本块。我是非常新的PHP。知道所有预期的ID应该是TEXTMASH-1FD0066D-F75A-5D0C-6784-2FA0D055B0D7格式的东西,我如何“清理”_GET以便它不容易受到任何攻击?我看了一些指南但是,我只是没有得到它。有人介意给我看?我真的很感激。

<?php 

include_once("../../extern/dbinclude.php");

$id= $_GET['id'];

$result = mysql_query("SELECT text FROM mytable WHERE id='$id'")
or die(mysql_error());  

$row = mysql_fetch_array($result);

if($row)
{
echo nl2br($row['text']);
} else {
?>
<h2>Invalid URL</h2>
<?php
}

3 个答案:

答案 0 :(得分:2)

您可以使用mysql_real_escape_string或可能使用正则表达式来检查输入。一个可能的正则表达式:

$pattern = '/^TEXTMASH-[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/';
if(!preg_match($pattern, $id))
{
    echo "No dice >:(";
    exit;
}

答案 1 :(得分:0)

清理输入的两个主要方面:

  1. 获得时验证。查看PHP filter functions以进行验证。在您的情况下,ID相当复杂,您可能需要一个自定义验证功能(可能使用正则表达式)。但是,我不明白为什么你在使用INTeger ID时甚至会使用这么复杂的ID,这是典型的。
  2. 在将用户变量插入数据库之前使用mysql_real_escape_string()prepared statements
  3. 每当您显示字符串变量时,请确保escape任何HTML字符。

答案 2 :(得分:0)

到目前为止,最好的方法是通过准备好的陈述。到目前为止,其他答案建议使用mysql_real_escape_string,这有效,但很容易被开发人员和PITA错过,必须一直使用。因为很容易错过并且很难找到这些错误,所以它不是一个可靠或可维护的解决方案。

准备好的陈述将这种痛苦从过程中解脱出来,并自动适当地逃避。

您可以在其他地方找到我们的更多信息on SO