如何在PHP和MySQL中的textarea中给出换行符时避免SQL注入?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (281)

:当说明框即用户给予换行符我想是textareaHTML,那么所有的数据安全地存储在SQL数据库,但如果用户提供链接,然后链接变成文字,但是当用户给输入或描述文本换行,然后将其保存在数据库中,当从数据库中检索它时,换行符将再次显示。

<textarea name"description" id="description" rows="4" cols="50">
//In The text area the user enter the text. Here I want if user gives html links then links becomes text and if user give line break then line break store in the database and I can get back as it is how user submitted the form. Also I want to store data securely for avoiding sql injection but dont have the exact idea how to do it.
</textarea>

$text = $_POST['description'];
$text = htmlentities($text); // Here I want to remove html entities for avoiding sql injection
$text = mynl2br($text);
// Now Fire Insert Query All the data save but while retrieving the data I am not able to get line break and turning links to the text.


function mynl2br($text) { 
   return strtr($text, array("\r\n" => '<br />', "\r" => '<br />', "\n" => '<br />')); 
} 

这就是我正在做的事情,但链接仍然是链接,当我检索文本显示没有换行符。所有文本都在一行或一个段落中。

请在上面的代码中建议我做错了什么。如何避免sql注入并可以安全地存储和检索数据。

提问于
用户回答回答于

在这个问题中有许多错误的假设需要解决。

  1. 永远不应将用户提供的数据注入查询中。您必须转义此数据,最简单的方法是使用占位符值的预准备语句。这是你的查询看起来INSERT INTO x (a,b) VALUES (?,?)然后你绑定每个占位符。SQL驱动程序负责其余的工作,您无需担心。作为即时奖励,您不会再花时间追踪查询中的简单语法错误,因为它们非常容易阅读,错误很明显。
  2. 如果没有适合显示的上下文,就不应该显示用户内容。对于HTML,您使用HTML转义函数htmlspecialchars来避免XSS(跨站点脚本)攻击。
  3. 你应该永远不会插入数据库时预逃生的内容。您必须尽可能插入原始和中性。如果您为HTML预迁移,则存在双重转义的风险,&amp&amp;如果您滑倒,则会导致出现在您的内容中。请记住,并非所有内容都是HTML。有时它是JSON。有时它是CSV。有时它是一个电子邮件主题行。每个都有自己特定的转义方法。
  4. 如果你觉得自己在这里过头,而且很容易被人淹没,因为安全是一个复杂且多方面的问题,你应该从一个已知的安全基础开始,并从那里开始使用最佳实践。核心PHP是不够的,你需要一个像LaravelFat-Free Framework或任何受欢迎的,经过验证的社区支持框架的框架,它可以提供对开箱即用的这些问题的保护。

如果考虑到所有这些因素,您的问题就不会存在。

在测试代​​码时,最好有一堆故意滥用的代码片段,您可以将其复制粘贴到输入字段中以测试常见错误。

测试你的HTML转义失败使整个屏幕变为红色:

<div style="position:absolute;top:0;left:0;right:0;bottom:0;background:red">Uh oh</div>

测试SQL注入问题:

It's not so <strong>"Bad"</strong>!

测试UTF-8支持,包括3字节“符号”和4字节表情符号:

Do you want to build a ☃? How about a ❄️☃️?

我还创建了长度为255,256,1024和65535的随机字符串,以查看插入长而不间断的字母串时页面格式会发生什么。除非明确地进行这种测试,否则许多页面将完全爆炸。由于病态错误的正则表达式,某些应用程序将因长输入而崩溃,或者在插入和遇到意外截断错误之前无法检测到超长内容。

框架通常具有在表单上表达约束的方法,以及在使用“SQL错误”屏幕爆炸之前干净地处理任何输入验证错误。

用户回答回答于

要保留新行,您必须保留原始换行符,如果替换它们,则必须将它们替换回来,或者只有在页面上显示文本(推荐)时才必须使用nl2br,而不是在存储或检索它以进行编辑之前。

同样适用于链接,在存储之前不要更改它们,只有在页面上显示它时才更换它,这样你再也不会有问题编辑了,你可以随时修改链接生成,因为你不存储结果但原来的。

为了避免SQL注入,你不想使用这些神奇的函数(htmlentities,strip_tags,magic_quotes等 - 有很多,但没有一个是完美的) - 最好的解决方案是使用预准备的语句: https:// dev。 mysql.com/doc/apis-php/en/apis-php-mysqli.quickstart.prepared-statements.html

它通过为值提供占位符来解决问题,因此用户输入无法修改查询。

扫码关注云+社区

领取腾讯云代金券