消除PHP/SQL $ _POST,$ _GET等......?

Mat*_*dge 2 php mysql-real-escape-string html-entities htmlspecialchars

好的,这个主题是我理解的温床.我也明白这种情况取决于您使用的代码.我有三种情况需要解决.

  1. 我有一个表格,我们需要允许人们发表使用逗号,波浪号等的评论和陈述......但仍然可以安全地免受攻击.

  2. 我有人进入这样的日期:10/13/11 mm/dd/yy英文,这可以消毒吗?

  3. 如何理解如何使用htmlspecialchars(),htmlentities()以及real_escape_string()是否正确?我已经阅读了php.net网站和这里的一些帖子,但在我看来这是一个情况,这一切都取决于阅读问题的人是什么正确的答案.

我真的不能接受......必须有一个答案,其中与我在这里发布的文本格式类似的文本格式可以被清理.我想知道是否以及如何做到这一点.

谢谢...因为在我看来,在其他地方提出这个问题时,它往往会烦恼...我正在学习我需要知道的东西,但我想我已经达到了一个平台,我所知道的就是没有一个例子它意味着......

提前致谢.

Mar*_*iet 10

这是一个非常重要的问题,它实际上有一个编码形式的简单答案.你面临的问题是你同时使用了很多语言.首先是HTML,然后是PHP,几秒钟之后是SQL.所有这些语言都有自己的语法规则.

要记住的是:字符串应始终处于正确的编码状态.

让我们举个例子.您有一个HTML表单,用户在其中输入以下字符串:

I really <3 dogs & cats ;')

按下提交按钮后,此字符串将发送到您的PHP脚本.让我们假设这是通过GET完成的.它被附加到URL,它有自己的语法(&字符具有特殊含义)所以我们正在改变语言.这意味着必须将字符串转换为正确的URL编码.在这种情况下,浏览器会这样做,但PHP也有一个urlencode功能.

在PHP脚本中,字符串存储在其中$_GET,编码为PHP字符串.只要您编写PHP,这就完全没问题了.但现在让我们把字符串用在SQL查询中.我们更改语言和语法规则,因此必须通过mysql_real_escape_string函数将字符串编码为SQL .

另一方面,我们可能希望再次将字符串显示给用户.我们从数据库中检索字符串,并将其作为PHP字符串返回给我们.当我们想要将它嵌入HTML输出时,我们再次更改语言,因此我们必须通过htmlspecialchars函数将字符串编码为HTML .

在整个过程中,字符串始终处于正确的编码状态,这意味着用户可以提出的任何字符都将相应地处理.一切都应该运行顺畅和安全.

要避免的事情(有时这甚至被无知者推荐)是过早地编码你的字符串.例如,您可以将其放入数据库之前应用于htmlspecialchars该字符串.这样,当您稍后从数据库中检索字符串时,您可以将它粘贴在HTML中没问题.听起来不错?是的,真的很棒,直到你开始得到人们的支持票,想知道为什么他们的PDF收据充满了垃圾.&amp; &gt;

在代码中:

form.html:

<form action="post.php" method="get">
    <textarea name="comment">
        I really <3 dogs &amp; cats ;')
    </textarea>
    <input type="submit"/>
</form>
Run Code Online (Sandbox Code Playgroud)

它生成的URL:

http://www.example.org/form.php?comment=I%20really%20%3C3%20dogs%20&amp;%20cats%20;')
Run Code Online (Sandbox Code Playgroud)

post.php中:

// Connect to database, etc....

// Place the new comment in the database
$comment = $_GET['comment']; // Comment is encoded as PHP string

// Using $comment in a SQL query, need to encode the string to SQL first!
$query = "INSERT INTO posts SET comment='". mysql_real_escape_string($comment) ."'";
mysql_query($query);

// Get list of comments from the database
$query = "SELECT comment FROM posts";

print '<html><body><h2>Posts</h2>';
print '<table>';

while($post = mysql_fetch_assoc($query)) {
    // Going from PHP string to HTML, need to encode!
    print '<tr><td>'. htmlspecialchars($post['comment']) .'</td></tr>';
}

print '</table>';
print '</body></html>'
Run Code Online (Sandbox Code Playgroud)

  • +1提及为什么在数据库插入之前进行HTML编码是一个坏主意. (2认同)