我有一些功能,首先:
JS公司:
$(document).ready(function() {
//dodavanje novog racuna
$(function() {
$('#addFieldForm').submit(function(e) {
e.preventDefault();
if ( $(this).parsley('validate') ) {
$.ajax({
url: "insertRacun.php",
type: "POST",
async: true,
data: { sifra:sifra,brojracuna:$("#brojracuna").val(),sufiks:$("#sufiks").val(),kupac:$("#kupac").val(),adresa:$("#adresa").val(),grad:$("#grad").val(),pib:$("#pib").val(),total:$("#total").text(),valuta:$("#valuta").val(),nacin:$("#nacin").val(),datum:$("#datum").val(),rok:$("#rok").val(),isporuka:$("#isporuka").val(),napomena:$("#napomena").val(),interna:$("#interna").val(),ponovi:$("#ponovi").val()},
dataType: "html",
etc...
菲律宾比索:
try {
$STH = $db->prepare("INSERT INTO racuni (br, sufiks, kupac, adresa, grad, pib, total,valuta,nacin,datum,rok,isporuka,napomene,interne, user_id,sifra) VALUES (:0,:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15)");
$STH->bindParam(':0', $_POST['brojracuna']);
$sufiks=$_POST['sufiks'];
$STH->bindParam(':1', $sufiks);
$STH->bindParam(':2', $_POST['kupac']);
$STH->bindParam(':3', $_POST['adresa']);
etc....
当我试图补充:
Luciansdasadsda"><script>alert(1)</script>
然后我在数据库中得到相同的值。
那么,如何在代码中防止XSS和SQL注入呢?
另外,如何防止拒绝服务(导致创建过多的行)?
最佳答案
OWASP Cross Site Scripting (XSS) Prevention Cheat Sheet
https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet
传递给数据库的字符串值存储在数据库中。这是预期的行为。MySQL、PDO或带有bind占位符的prepared语句中的任何内容都不能防止存储类似javascript的字符串。
这些都是为了防止恶意字符串被解释为SQL语句的一部分,ala XKCD利用Momhttps://xkcd.com/327/
Robert'; DROP TABLE students; --
所以,你处理“小鲍比桌子”很好。
你问的是如何处理鲍比的表弟:“狡猾的厄尔”。
<script>alert('hello')</script>
我们可以很好地将Shifty Earl的名字插入到表中;不会阻止恶意的SQL注入。
当我们把“Shifty Earl”的名字放回网页上时,问题就来了。
我们必须将他的名字视为潜在的不安全因素(就像我们对待小博比桌子一样)。
在这里,把它放在网页上是不安全的,除非我们能正确地避开它。
那么,我们怎样才能逃出去让它安全的展示呢?
PHP有一个很棒的函数,名为
htmlentities
。(其他语言/库具有同等的功能。)返回时间:
htmlentities("<script>alert('hello')</script>")
会是这样的:
<script>alert('hello')</script>
注意“
<
”被称为html实体。它表示“小于”字符,但不会被解释为标记的开头。我们会得到与“<
”相同的结果。当我们把转义/编码的字符串放到网页上时,浏览器显示的内容看起来像原始字符串。。。
<script>alert('hello')</script>
但是,这不是也不会被解释为HTML标记。
如何防止XSS漏洞?
通过在将所有潜在的不安全值合并到网页中时(在准备将网页发送到客户端时)正确转义所有潜在的不安全值(将HTML标记字符替换为等效的HTML实体)
数据库真的和它无关。
当我们在数据库中存储字符串时,我们不执行“htmlenties”转义的原因是它不是执行此操作的正确位置。
查看您的代码的人将看到一个潜在的不安全值正被放到web页面上,并将在那里添加适当的
htmlentities
函数,或者在它被放到页面之前。然后我们得到双重转义,第二次编码值。当值放在网页上时,进行转义的正确位置是正确的。
可能存在不安全值的其他来源、从文件读取的值、从其他表读取的值或用户在web窗体上提供的值。如果代码假设某个表中某个特定列的值是“安全的”,而其他源的值是不安全的,那将是不可靠的。
OWASP SQL Injection
https://www.owasp.org/index.php/SQL_Injection
OWASP Cross Site Scripting (XSS) Prevention Cheat Sheet
https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet