0

一段时间以来,我一直在学习 PHP 和 MySQL 的(基础知识),并且我已经调整/构建了一些我非常满意的东西——当然要感谢 StackOverflow,因为它是一个很棒的学习场所。不过,我现在很困惑,所以我希望你能指出我正确的方向。

我已经阅读了所有关于用户输入带来的 XSS 和 SQL 注入风险的粗体大写,我打算始终保持谨慎。到目前为止,我试图从客户那里获得最少的队列,并尽可能坚持基本的比较;但现在我正在做一个需要处理一堆文本(以及一些下拉菜单)的项目。

到目前为止,我有一个像这样工作的测试骡子:

  1. 用户设置下拉菜单,输入一段文本(进入 textarea),提交表单。

  2. 处理程序页面将表单数据回显给用户以进行确认,并在此页面上填充另一个表单的隐藏值,该表单使用“确认”按钮提交。

  3. 'Final' 处理程序执行 mysql_query 以插入包含已处理表单数据的行。

本质上,我想获取一个$submittedText字符串,并对其进行修改,以使恶意输入对于确认预览(回显)和插入 MySQL 数据库都无害;但至关重要的是,保留用户无意中输入文本区域的任何换行符。

我一直在使用:

<?php

 $submittedText = $_POST['Text'];    
 $processedText = nl2br(htmlentities($submittedText, ENT_QUOTES, 'UTF-8'));
 echo $processedText;

?>

...为了我的确认,这似乎使我扔给它的任何东西都安全,当我通过时$processedTextmysql_real_escape_string我没有得到任何数据库讨厌;当我想把它重新拿出来时,我的问题就来了……

我想我可以使用:

$processedOutput = strip_tags($databaseText, '<br>');

...这会捕获任何 HTML/<script>标签,但如果<?php // ?>从数据库读取的文本中有任何内容,它会在运行我的 PHP 时由预处理器解析,这至少会产生意想不到的结果,并且可能用于封装其他讨厌的。我在否定恶意输入方面取得的任何更多成功往往会终止换行符。

如果有人能指出我正确的方向,我将永远感激不尽。

非常感谢,

抢。

4

1 回答 1

0

在您的确认页面上,使用两个变量。一个打印给用户,另一个提交给数据库:

$submittedText = $_POST['Text'];    
$processedText = nl2br(htmlentities($submittedText, ENT_QUOTES, 'UTF-8'));
$sqltext = mysql_real_escape_string($submittedText);
// use $sqltext to insert into the database
// user $processedText to print to the user on the confirmation page.

当您将文本拉回时,您可以再次将字符串格式化为您想要打印给用户的任何格式。

于 2013-07-03T01:45:21.563 回答