在PHP和MySQL中,如何避免在textarea中换行时进行SQL注入?

在PHP和MySQL中,如何避免在textarea中换行时进行SQL注入?,php,html,mysql,laravel,sql-injection,Php,Html,Mysql,Laravel,Sql Injection,我想要的是当用户在描述框中给出换行符时,即:textarea在HTML中,然后所有数据都安全地存储在SQL数据库中,但是,如果用户提供链接,则链接也会变成文本,但当用户在“描述”文本框中输入enter或换行符时,它会保存在数据库中,从数据库中检索时,换行符会再次显示 <textarea name"description" id="description" rows="4" cols="50"> //In The text area the user enter the text. H

我想要的是当用户在描述框中给出换行符时,即:
textarea
HTML
中,然后所有数据都安全地存储在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 />')); 
} 

//在文本区域中,用户输入文本。在这里,我想如果用户提供html链接,然后链接变成文本,如果用户提供换行符,然后换行符存储在数据库中,我可以得到用户提交表单的方式。我还想安全地存储数据,以避免sql注入,但我不知道该怎么做。
$text=$_POST['description'];
$text=htmlentities($text);//这里我想删除html实体以避免sql注入
$text=mynl2br($text);
//现在Fire Insert查询保存的所有数据,但在检索数据时,我无法获得换行符和文本链接。
函数mynl2br($text){
返回strtr($text,array(“\r\n”=>”
“,“\r”=>”
“,“\n”=>”
”); }
这就是我正在做的,但是链接仍然是链接,当我检索文本时,文本显示没有换行。将所有文本放在一行或一段中


请指出我在上述代码中做错了什么。如何避免sql注入并安全地存储和检索数据。

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

同样的情况也适用于链接,在存储之前不要更改它们,只在页面上显示时替换它们,这样您就不会有再次编辑它的问题,并且您可以随时修改链接生成,因为您不存储结果,而是存储原始结果

为了避免SQL注入,您不想使用这些神奇的函数(htmlentities、strip_标记、magic_引号等——虽然有很多,但没有一个是完美的)——最好的解决方案是使用预先准备好的语句:


它通过为值提供占位符来解决问题,这样用户输入就不能修改查询。

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

  • 您应该永远不要将用户提供的数据注入到查询中。必须转义此数据,最简单的方法是使用占位符值准备语句。也就是说,您的查询看起来像
    插入x(a,b)值(?)
    ,然后针对每个占位符进行绑定。SQL驱动程序会处理其余部分,您不必担心。作为一个直接的奖励,您不会再花更多的时间跟踪查询中的简单语法错误,因为它们很容易阅读,错误也很明显
  • 您应该永远不要显示用户内容而不转义它所显示的上下文。也就是说,对于HTML,您可以使用HTML转义函数来避免XSS(跨站点脚本)攻击
  • 插入数据库时,您应该永远不要预先转义内容。您必须插入尽可能原始和中性的内容。如果您预先转义为HTML,则会有双重转义的风险,从而导致类似
    &将显示在你的内容中。记住,不是所有的东西都是HTML。有时是JSON。有时是CSV。有时是电子邮件的主题行。每种方法都有其特定的转义方法
  • 如果你觉得你在这里,你很容易被淹没,因为你应该从一个已知的安全基础开始,并从那里建立最佳实践。核心PHP是不够的,您需要一个像PHP这样的框架,或者任何流行的、经验证的、社区支持的框架,以提供针对这些问题的即时保护 如果你把所有这些都考虑进去,你的问题就不存在了

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

    如果失败使整个屏幕变红,请测试HTML转义:

    <div style="position:absolute;top:0;left:0;right:0;bottom:0;background:red">Uh oh</div>
    
    我还创建了长度为255、256、1024和65535的随机字符串,以查看插入长的、不间断的字母字符串时页面格式会发生什么变化。除非明确完成此类测试,否则许多页面将彻底崩溃。某些应用程序将因病理性错误的正则表达式而在长输入时崩溃,或者在插入之前无法检测超长内容,并出现意外的截断错误


    框架通常有一些方法来表达表单上的约束,并在出现“SQL错误”屏幕之前干净地处理任何输入验证错误。

    我想你的自制
    nl2br
    不起作用了。在该函数调用之后,
    $text
    显示为什么?而且,所有这些都不会阻止SQL注入。您应该参数化。
    htmlentities()
    与SQL注入无关。您应该通过或使用带绑定参数的准备语句。有一些很好的例子。通过允许用户输入HTML标记,您通过设计创建了XSS漏洞。您应该了解XSS以及SQL注入:非常感谢!你分享了很多知识。再次衷心感谢你!注意安全!外面的世界很丑陋。
    It's not so <strong>"Bad"</strong>!
    
    Do you want to build a ☃? How about a ❄️☃️?