如何避免sql注入,同时在php和mysql的textarea中提供换行符?

vzgqcmou  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(662)

我想要的是当用户在描述框中给出换行符时,即: textareaHTML 然后所有数据都安全地存储在sql数据库中,但是如果用户提供链接,那么链接也会变成文本,但是当用户在描述文本框中提供enter或换行符时,它会保存在数据库中,当从数据库中检索时,换行符会再次显示。

<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注入并安全地存储和检索数据。

pdtvr36n

pdtvr36n1#

要保留新行,必须保留原来的换行符,如果替换它们,则必须将其替换回原来的换行符,或者只能在页面上显示文本时使用nl2br(推荐),而不能在存储或检索文本进行编辑之前使用。
同样也适用于链接,存储前不要更改它们,只有在页面上显示时才替换它们,这样您就不会有再次编辑它的问题,并且您可以随时修改链接生成,因为您不存储结果而是存储原始结果。
为了避免sql注入,您不想使用这些神奇的函数(htmlentities、strip\u tags、magic\u quotes等—有很多,但没有一个是完美的)—最好的解决方案是使用准备好的语句:https://dev.mysql.com/doc/apis-php/en/apis-php-mysqli.quickstart.prepared-statements.html
它通过为值提供占位符来解决问题,这样用户输入就不能修改查询。

jv2fixgn

jv2fixgn2#

在这个问题上有许多错误的假设需要解决。
决不能将用户提供的数据注入到查询中。必须转义此数据,最简单的方法是使用占位符值对准备好的语句进行转义。这就是你的问题 INSERT INTO x (a,b) VALUES (?,?) 然后你和每个占位符绑在一起。sql驱动程序负责其余的工作,您不必担心。作为一个直接的奖励,您将不会再花费更多的时间跟踪查询中的简单语法错误,因为它们将非常容易阅读,错误将是显而易见的。
在显示用户内容时,必须根据其显示的上下文进行适当的转义。对于html,您可以使用html转义函数,如 htmlspecialchars 以避免xss(跨站点脚本)攻击。
在插入数据库时,不应预先转义内容。您必须尽可能地插入原始和中性。如果您预先为html转义,您将面临双重转义的风险,从而导致类似的情况 &amp&amp; 如果你犯了错就会出现在你的内容里。记住,不是所有的东西都是html。有时是json。有时是csv。有时是电子邮件主题行。每种方法都有自己独特的转义方法。
如果你觉得你在这里,你很容易被淹没,因为安全是一个复杂的和多方面的关注,你应该从一个已知的安全基础开始,并从那里建立最佳实践。核心php还不够,您需要一个像laravel、fat-free框架或任何流行的、经过验证的、社区支持的框架这样的框架,以提供对这些问题的现成保护。
如果你把所有这些都考虑进去,你的问题就不存在了。
在测试代码时,最好有一堆故意滥用的代码片段,可以将它们复制粘贴到输入字段中,以测试是否存在常见错误。
如果失败使整个屏幕变红,请测试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错误”屏幕之前干净地处理任何输入验证错误。

相关问题