Sql injection 如何防止跨站点脚本编写?

Sql injection 如何防止跨站点脚本编写?,sql-injection,security,xss,Sql Injection,Security,Xss,我将php、mysql与smarty一起使用,并将其放置在用户可以放置注释等的位置。在插入数据库进行SQL注入之前,我已经对字符进行了转义。我还需要做什么?防止SQL注入的最佳方法就是不要使用接受用户输入的动态SQL。相反,将输入作为参数传入;这样,它将是强类型的,并且不能注入代码。对于SQL注入,转义是不够的-您应该尽可能使用数据访问库和参数化查询 对于XSS(跨站点脚本),从html编码输出的数据开始。同样,反XSS库是您的朋友 当前的一种方法是只允许非常有限数量的标记进入,并对过程中的标记

我将php、mysql与smarty一起使用,并将其放置在用户可以放置注释等的位置。在插入数据库进行SQL注入之前,我已经对字符进行了转义。我还需要做什么?

防止SQL注入的最佳方法就是不要使用接受用户输入的动态SQL。相反,将输入作为参数传入;这样,它将是强类型的,并且不能注入代码。

对于SQL注入,转义是不够的-您应该尽可能使用数据访问库和参数化查询

对于XSS(跨站点脚本),从html编码输出的数据开始。同样,反XSS库是您的朋友


当前的一种方法是只允许非常有限数量的标记进入,并对过程中的标记进行清理(白名单+清理)。

您需要确保人们不能在评论中发布JavaScript代码或可怕的HTML。我建议你不允许任何东西,但非常基本的标记

如果注释不应包含任何标记,则执行

echo htmlspecialchars($commentText);
应该足够了,但它很粗糙。最好是在将所有输入放入数据库之前对其进行清理。PHP函数可以帮助您开始


如果您希望允许HTML注释,但为了安全起见,您可以试一试。

XSS主要是关于HTML转义(*)。任何时候,无论是从数据库、直接从用户输入、从文件还是完全从其他地方获取纯文本字符串并将其放入HTML页面,都需要对其进行转义


最小的HTML转义是将所有
&
符号转换为
&
和所有
在将用户输入的数据放入数据库之前,不应修改这些数据。修改应该在您将其输出到网站时进行。您不想丢失原始数据


当你把它吐到网站上时,你想用类似于
htmlspecialchars(“我的输出和东西”,entu QUOTES,'UTF-8')
的东西将特殊字符转义为HTML代码——确保指定你正在使用的字符集。此字符串将被转换为
my output&;内容
供浏览器阅读。

@shahinkian-看起来是用于SQL注入保护的好方法。@Oded:我建议使用白名单策略和非HTML,如BBCode。不要不必要地吓唬人。如果始终如一地执行,转义肯定足以防止SQL注入。索拉林:我强烈建议我们不要依赖逃跑。你可以说“始终如一地做”就足够了,但并不总是始终如一地做,即使如此,也不总是足够的。(例如,您无法转义表面上的数字值,也无法可靠地避免所有边缘情况,例如嵌入式NUL。)我认为将数字值转换为字符值可能存在一些问题。至少在MSSQL中,如果可以使用索引(现在是错误的类型)或在某些情况下给出强制转换异常,那么它会起作用。就我个人而言,我总是更愿意把参数化的责任放在一个库上(比如db access库),与我刚刚提出的东西相比,很多人都使用这个库。我认为你不应该在不通知他们的情况下删除用户数据。只要有错误,就说不是allowed@d03boy:我部分同意,但你可以用同样的函数来做。清理输入并与原始输入进行比较。如果是不同的,请显示一个错误信息。我认为这完全是相关的,因为沙希金恩希望使他们的代码更安全,但是承认使用一种礼貌的方法不是最好的做法。好吧,我误读了他的问题。编辑你的答案,这样我就可以改变我的反对票。@d03boy,嘿,别担心。无论如何,这真的只是一句相切的话。显然你只想到XSS而不是SQL注入@jsd911这是一个关于XSS的问题,所以我将我的信息限于XSS。。。SQL注入是另一个主题
<p> Hello, <?php htmlspecialchars($name); ?>! </p>
<p> Hello, {$name|escape:'html'}! </p>